/// <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); } }
/// <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); } }
/// <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); } } } }
/// <summary> /// Устанавливает значение модельного времени в 0 /// </summary> public void SetTimeToZero() { time = 0; startFromZero = true; for (int i = 0; i < RegionsCount; i++) { RBN rbn = (RBN)Regions[i]; rbn.ClearQueue(); } }
/// <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); }
/// <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(); } }
/// <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); }
/// <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); }
/// <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; }
/// <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); } }
/// <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(); } }