Exemple #1
0
 /// <summary>
 /// Функция реализует работу централизованной балансировки
 /// </summary>
 void CentralizedHandler()
 {
     NotBalancedHandler();
     int[] dev = deviation_average_weight(compute_mean_weigth());
     for (int i = 0; i < RegionsCount; i++)
     {
         RBN rbn_i = (RBN)Regions[i];
         for (int j = 0; (j < RegionsCount); j++)
         {
             if (i != j)
             {
                 RBN rbn_j = (RBN)Regions[j];
                 if (dev[i] > dev[j] && !rbn_j.QueueIsFull() &&
                     !rbn_i.QueueIsEmpty())
                 {
                     rbn_j.SetNewQuery(rbn_i.GetLastQueryFromQueue());
                 }
                 if (dev[i] < dev[j] && !rbn_i.QueueIsFull() &&
                     !rbn_j.QueueIsEmpty())
                 {
                     rbn_i.SetNewQuery(rbn_j.GetLastQueryFromQueue());
                 }
             }
         }
         SendAns(rbn_i);
     }
 }
Exemple #2
0
        /// <summary>
        /// Выбирает регион с максимальным весом очереди
        /// </summary>
        /// <param name="j">номер главного региона</param>
        /// <returns>регион с максимальным весом</returns>
        RBN MaxWeightRegion(int j)
        {
            ArrayList NotSleepRegions = new ArrayList(RegionsCount);

            for (int i = 0; i < RegionsCount; i++)
            {
                RBN rbn = (RBN)Regions[i];
                if (!rbn.IsSleep())
                {
                    NotSleepRegions.Add(rbn);
                }
            }
            if (NotSleepRegions.Count > 0)
            {
                RBN maxWeight = (RBN)NotSleepRegions[0];
                for (int i = 1; i < NotSleepRegions.Count; i++)
                {
                    RBN rbn = (RBN)NotSleepRegions[i];
                    if (maxWeight.Weight_Compute(WeightComputeMode) <
                        rbn.Weight_Compute(WeightComputeMode))
                    {
                        maxWeight = rbn;
                    }
                }
                return(maxWeight);
            }
            else
            {
                return(null);
            }
        }
Exemple #3
0
 /// <summary>
 /// Функция реализует работу без балансировщика
 /// </summary>
 void NotBalancedHandler()
 {
     for (int i = 0; i < RegionsCount; i++)
     {
         RBN rbn = (RBN)Regions[i];
         rbn.Work(time);
         if (ThrottleCount == Throttle)
         {
             if (RIA != null)
             {
                 RIA(rbn.Region_num, !rbn.IsSleep());
             }
             if (QS != null)
             {
                 QS(rbn.Region_num, rbn.GetQueueCount());
             }
             if (QCS != null)
             {
                 QCS(rbn.Region_num, rbn.TOTAL_QUERY_COUNT);
             }
             if (QWS != null)
             {
                 QWS(rbn.Region_num, rbn.Weight_Compute());
             }
             if (GR != null)
             {
                 GR(GeneralRNBnum);
             }
         }
     }
 }
Exemple #4
0
 /// <summary>
 /// Устанавливает значение модельного времени в 0
 /// </summary>
 public void SetTimeToZero()
 {
     time          = 0;
     startFromZero = true;
     for (int i = 0; i < RegionsCount; i++)
     {
         RBN rbn = (RBN)Regions[i];
         rbn.ClearQueue();
     }
 }
Exemple #5
0
        /// <summary>
        /// Функция вычисляет среднее значение весов регионов
        /// </summary>
        /// <returns>среднее значение весов регионов </returns>
        float compute_mean_weigth()
        {
            float s = 0;

            for (int i = 0; i < RegionsCount; i++)
            {
                RBN rbn = (RBN)Regions[i];
                s += rbn.Weight_Compute(WeightComputeMode);
            }
            return(s / RegionsCount);
        }
Exemple #6
0
 /// <summary>
 /// При наличии выполненных запросов для другого региона,
 /// они будут отосланы в свои регионы
 /// </summary>
 /// <param name="rbn">рабочий регион</param>
 void SendAns(RBN rbn)
 {
     if (rbn.AnotherQueries.Count > 0)
     {
         for (int k = 0; k < rbn.AnotherQueries.Count; k++)
         {
             int[] arr = (int[])rbn.AnotherQueries[k];
             ((RBN)Regions[arr[2] - 1]).ReciveAns(arr, rbn.Region_num);
         }
         rbn.AnotherQueries.Clear();
     }
 }
Exemple #7
0
 /// <summary>
 /// Возращает true если есть главный регион
 /// </summary>
 /// <returns>true если есть главный регион</returns>
 bool GeneralRegions()
 {
     for (int i = 0; i < RegionsCount; i++)
     {
         RBN rbn = (RBN)Regions[i];
         if (rbn.general)
         {
             GeneralRNBnum = rbn.Region_num;
             return(true);
         }
     }
     GeneralRNBnum = 0;
     return(false);
 }
Exemple #8
0
 /// <summary>
 /// Функция вычисляет отклонение веса региона от среднего веса
 /// </summary>
 /// <param name="mean">среднее значение весов регионов</param>
 /// <returns>массив целых чисел для каждого региона:
 /// 0 - "-" девиация 1 - "+" девиация</returns>
 int[] deviation_average_weight(float mean)
 {
     int[] deviation = new int[RegionsCount];
     for (int i = 0; i < RegionsCount; i++)
     {
         RBN rbn = (RBN)Regions[i];
         if (rbn.Weight_Compute(WeightComputeMode) > mean)
         {
             deviation[i] = 1;
         }
         else
         {
             deviation[i] = 0;
         }
     }
     return(deviation);
 }
Exemple #9
0
        /// <summary>
        /// Инициализация регионов
        /// </summary>
        void InitRegions()
        {
            delta_count = 2 + RegionsCount;
            float delta = 1440.0F / delta_count;

            time = RegionsCount * delta;
            for (int i = 0; i < RegionsCount; i++)
            {
                int   k          = i + 1;
                float start_time = i * delta;
                RBN   rbn        = new RBN(k, k * ClientsCount, k * ClientsCount,
                                           k * ServersCount, k * DB_capacity, start_time, start_time + time);
                rbn.Set_normalizing_factor((float)(RegionsCount * ClientsCount) /
                                           rbn.db_capacity);
                Regions.Add(rbn);
            }
            time = 720;
        }
Exemple #10
0
 /// <summary>
 /// Функция реализует работу второго варианта централизованной балансировки
 /// </summary>
 void CentralizedHandlerType2()
 {
     NotBalancedHandler();
     for (int i = 0; i < RegionsCount; i++)
     {
         RBN rbn = (RBN)Regions[i];
         if (rbn.IsSleep())
         {
             RBN another_rbn = MaxWeightRegion(i);
             if (another_rbn != null)
             {
                 if (!rbn.QueueIsFull() && another_rbn.CanGetQuery())
                 {
                     rbn.SetNewQuery(another_rbn.GetQueryFromQueue());
                 }
             }
         }
         SendAns(rbn);
     }
 }
Exemple #11
0
 /// <summary>
 /// Запуск симуляции по кнопке
 /// </summary>
 private void StartSimButton_Click(object sender, EventArgs e)
 {
     for (int i = 0; i < StatusWindows.Count; i++)
     {
         ((StatusWindow)StatusWindows[i]).Dispose();
     }
     StatusWindows.Clear();
     if (OutputHandler.Init(FilePathTextBox.Text))
     {
         t = new Thread(new ThreadStart(MainThread));
         int BalanceType = 0;
         if (NoBalanceRadioButton.Checked)
         {
             BalanceType = 0;
         }
         if (DeCentralizedBalanceRadioButton.Checked)
         {
             BalanceType = 1;
         }
         if (CenralizedBalanceRadioButton.Checked)
         {
             BalanceType = 2;
         }
         if (DeCentralizedT2RadioButton.Checked)
         {
             BalanceType = 3;
         }
         if (CentralizedType2RadioButton.Checked)
         {
             BalanceType = 4;
         }
         ModelDays = (int)ModelDaysNumericUpDown.Value;
         DaysProgressBar.Maximum = ModelDays;
         DaysProgressBar.Value   = 0;
         TimeProgressBar.Maximum = 1440;
         ModelDaysLabel.Text     = "0";
         StopSimButton.Enabled   = true;
         StartSimButton.Enabled  = false;
         rh = new RegionsHandler((int)RegionsUpDown5.Value,
                                 (int)ClientsNumericUpDown.Value, (int)ServersUpDown.Value,
                                 (int)DBcapNumericUpDown.Value, BalanceType);
         rh.SetThrottle(RefreshSpeedTrackBar.Value);
         if (ZeroTimeСheckBox.Checked)
         {
             rh.SetTimeToZero();
         }
         rh.TS     += new TimeStatus(TimeStatusHandler);
         rh.DaysTS += new TimeStatus(ModelDaysStatusHandler);
         NextNum.Mode(RandomQueryCheckBox.Checked);
         if (StatusWindowsCheckBox.Checked)
         {
             int col = 0;
             int row = 0;
             for (int i = 0; i < rh.Regions.Count; i++)
             {
                 RBN          rbn = (RBN)rh.Regions[i];
                 StatusWindow sw  = new StatusWindow(rbn.Region_num,
                                                     rbn.Region_num * (int)ServersUpDown.Value,
                                                     rbn.Region_num * (int)ClientsNumericUpDown.Value,
                                                     rbn.Region_num * (int)ClientsNumericUpDown.Value,
                                                     rbn.Region_num * (int)DBcapNumericUpDown.Value);
                 StatusWindows.Add(sw);
                 rh.RIA += new RegionIsActive(sw.RegionStatusHandler);
                 rh.QS  += new QueueStatus(sw.QueueStatusHandler);
                 rh.QCS += new QueryCountStatus(sw.QueryCountStatusHandler);
                 rh.QWS += new QueueWeightStatus(sw.QueueWeightStatusHandler);
                 rh.GR  += new GeneralRegionStatus(sw.GeneralRegionStatusHandler);
                 if ((col + 1) * sw.Width + sw.Width >
                     Screen.PrimaryScreen.WorkingArea.Width)
                 {
                     col = 0;
                     row++;
                 }
                 sw.SetLocation((++col) * sw.Width, row * sw.Height);
             }
         }
         thread_life = true;
         t.Start();
     }
 }