/// <summary> /// Размещает запросы в очереди по серверам /// </summary> /// <param name="k">Количество мест в очереди сервера</param> void QueueAllocation(int k) { for (int j = 0; j < k; j++) { for (int i = 0; i < Clusters.Count; i++) { cluster cl = (cluster)Clusters[i]; if ((cl.GetQueueCount() < 2) && local_queue.Count > 0) { int[] arr = (int[])local_queue.Peek(); //если запрос из своего региона if (arr[2] == Region_num) { cluster_client cl_w = (cluster_client)Clients[arr[1]]; if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cl_w.GetWieghtQuery(); } } else { if (CURENT_TOTAL_W > 0) { CURENT_TOTAL_W -= cluster_query.GetQueryWeightByNum(arr[0]); } } cl.QueueAdd((int[])local_queue.Dequeue()); cl.SetQueryTime(); } } } }
/// <summary> /// Очищает очередь региона и серверов в регионе /// (нужна для старта в момент времени 0) /// </summary> public void ClearQueue() { local_queue.Clear(); for (int i = 0; i < Clusters.Count; i++) { cluster cl = (cluster)Clusters[i]; cl.QueueRemove(); cl.QueueRemove(); } for (int i = 0; i < Clients.Count; i++) { cluster_client cl = (cluster_client)Clients[i]; cl.request_sended = false; } CURENT_TOTAL_W = 0; }
/// <summary> /// Инициализая серверов и клиентов /// </summary> private void InitClientCluster() { for (int i = 0; i < Clients.Capacity; i++) { cluster_client cl = new cluster_client(i, Region_num); Clients.Add(cl); } QueueRecive(); //Инициализация очереди РБН for (int i = 0; i < Clusters.Capacity; i++) { cluster cl = new cluster(); Clusters.Add(cl); } QueueAllocation(2); //Инициализация очереди серверов QueueRecive(); //Заполенение очереди РБН }
/// <summary> /// проверяет кластеры на наличие выполненных запросов /// </summary> /// <returns>true - если есть сервера с выполенными запросами</returns> bool CheckClusters() { bool flag = false; for (int i = 0; i < Clusters.Count; i++) { cluster cl = (cluster)Clusters[i]; if (cl.query_time < 0.01 && cl.GetQueueCount() > 0) { int[] arr = cl.GetQueryInfo(true); //если запрос из своего региона if (arr[2] == Region_num) { TOTAL_QUERY_COUNT++; cluster_client client = (cluster_client)Clients[arr[1]]; client.ReciveAns(time); //Номер региона;номер запроса в регионе;номер запроса; //номер клиента;номер региона клиента; время задержки; время string output = String.Format( "{0};{1};{2};{3};{4};{5:F2};{6:F2};{7}", Region_num, TOTAL_QUERY_COUNT, arr[0], arr[1], arr[2], client.recive_time, time, local_queue.Count); OutputHandler.WriteLine(output); } else { AnotherQueries.Add(arr); } if (cl.GetQueueCount() > 0) { cl.SetQueryTime(); } flag = true; } } return(flag); }