Системы массового обслуживания Анализ некоторых методов размещения в памяти очереди с n приоритетами1 А. В. Драц, А. В. Соколов, д. ф.-м. н.2 Петрозаводский универ-т, ИПМИ КарНЦ РАН, Петрозаводск adeon88@mail.ru, avs@krc.karelia.ru В работе рассматриваются представления очереди с n приоритетами в памяти одного уровня в виде массива и в виде n последовательных FIFOочередей. Возможны операции “вставить”, “удалить элемент с наибольшим приоритетом” и “найти элемент”. Предложены алгоритмы нумерации состояний, построения соответствующих поглощающих цепей Маркова и нахождения оптимального разбиения памяти с точки зрения максимизации среднего времени работы до переполнения. Приводятся результаты численных экспериментов. Ключевые слова: очереди с приоритетами, FIFO-очереди, случайное блуждание, цепи Маркова, динамические структуры данных. 1. Введение Во многих приложениях используется структура данных, в которой основными операциями являются вставка элемента и удаление элемента с наибольшим приоритетом. Такую структуру данных называют приоритетной очередью. Основными методами реализации такой структуры данных являются упорядоченные и неупорядоченные списки, массивы, бинарные деревья, пирамиды [1–4]. В работе будут рассмотрены представления в виде массива и в виде n последовательных FIFO-очередей. Ранее случай n = 2 был рассмотрен в работе [5]. 1 Работа выполнена при финансовой поддержке РФФИ (грант №09-01-00330- а). 2 А. c В. Драц, А. В. Соколов, 2009 115 2. Постановка задачи Рассмотрим очередь с n приоритетами, расположенную в размере памяти m. Будем считать, что время дискретно, и в каждый момент времени происходит одна из следующих операций: • вставить элемент с приоритетом i с вероятностью pi , i = 1, ..., n; • удалить элемент с наибольшим приоритетом с вероятностью q; • найти элемент с наибольшим приоритетом с вероятностью r: p1 + · · · + pn + q + r = 1. Наивысший приоритет равен n, наименьший – 1. Работа начинается с пустой очереди. Предположим также, что не происходит завершения работы в случае исключения элемента из пустой структуры данных. Требуется найти среднее время работы до переполнения при различных вариантах представления, а в случае представления в виде n FIFO-очередей оптимальное разбиение памяти между очередями. 3. Представление в виде массива В случае представления в виде массива в памяти вместе с информационной частью хранится ключ(приоритет), поэтому часть памяти расходуется на приоритеты. Введем обозначения: p = p1 + · · · + pn ; l – отношение размера памяти, которую занимает ключ, к размеру информационной части; m – количество элементов, которые можно расположить в M = 1+l памяти вместе с ключами. В работе [5] в качестве математической модели было предложено случайное блуждание в интервале длины M , в [6,7] показано, 116 что среднее время работы до переполнения равно: q M+1 q −M − 1 − 1 , p 6= q, + q−p (q − p)2 p T = 1 (m + 1)(m + 2), p = q. 2q 4. Представление в виде n последовательных FIFO-очередей В случае представления в виде n FIFO-очередей все элементы, имеющие один и тот же приоритет, помещаются в одну FIFOочередь. Количество FIFO-очередей будет равно количеству приоритетов. Пусть ki — память, выделенная i-ой FIFO-очереди. Рассмотрим фиксированное разбиение памяти между очередями. В качестве математической модели рассмотрим блуждание по целочисленному n-мерному параллелепипеду с вершиной в начале координат, ребрами, параллельными осям координат, и длинами ребер k1 , . . . , kn . Qn Количество состояний равно i=1 (ki + 1). Перечислим их: (0, 0, 0, . . . , 0, 0), (0, 0, 0, . . . , 0, 1), . . . , (0, 0, 0, . . . , 0, kn − 1), (0, 0, 0, . . . , 0, kn ), (0, 0, 0, . . . , 1, 0), (0, 0, 0, . . . , 1, 1), . . . , (0, 0, 0, . . . , 1, kn − 1), (0, 0, 0, . . . , 1, kn ), ... (0, 0, 0, . . . , kn−1 − 1, 0), (0, 0, 0, . . . , kn−1 − 1, 1), . . . , (0, 0, 0, . . . , kn−1 − 1, kn − 1), (0, 0, 0, . . . , kn−1 − 1, kn ), (0, 0, 0, . . . , kn−1 , 0), (0, 0, 0, . . . , kn−1 , 1), . . . , (0, 0, 0, . . . , kn−1 , kn − 1), (0, 0, 0, . . . , kn−1 , kn ), ... (1, 0, 0, . . . , 0, 0), (1, 0, 0, . . . , 0, 1), . . . , (1, 0, 0, . . . , 0, kn − 1), (1, 0, 0, . . . , 0, kn ), ... (k1 , 0, 0, . . . , 0, 0), (k1 , 0, 0, . . . , 0, 1), . . . , (k1 , 0, 0, . . . , 0, kn − 1), (k1 , 0, 0, . . . , 0, kn ), ... (k1 , k2 , k3 , . . . , kn−1 , 0), (k1 , k2 , k3 , . . . , kn−1 , 1), . . . , 117 (k1 , k2 , k3 , . . . , kn−1 , kn − 1), (k1 , k2 , k3 , . . . , kn−1 , kn ). Введем нумерацию этих состояний, начиная с 0. Пример нумерации состояний при n = 3, m = 8 представлен на рис. 1. Рис. 1: Пример нумерации при m = 8, n = 3, k1 = 2, k2 = 4, k3 = 3. Для того чтобы построить матрицу переходных вероятностей, построим функцию F (X) = I, X = (x1 , x2 , . . . , xn ), где x1 , x2 , . . . , xn – текущие длины очередей, I – номер состояния. В случае n = 1, то функция имела бы вид F (x1 ) = x1 . Если появляется вторая очередь, то состояния (xi ) становятся эквивалентными (xi , 0). Между состояниями (xi , 0) и (xi+1 , 0) нужно вставить k2 − 1 состояний: (xi , 1), (xi , 2), . . . , (xi , kn−1 − 1), поэтому функция будет иметь вид F (x1 , x2 ) = k2 x1 + x2 . При появлении третьей очереди получаем функцию F (x1 , x2 , x3 ) = k3 (k2 x1 + x2 ) + x3 . Рассуждая таким образом, получим для n очередей F (x1 , x2 , . . . , xn ) = kn (kn−1 (. . . (k3 (k2 x1 + 118 x2 ) + x3 ) + · · · + xn−1 ) + xn . Для построения матрицы переходных вероятностей нужно перебрать все состояния (от (0, 0, . . . , 0, 0) до (k1 , k2 , . . . , kn−1 , kn )) и вычислить вероятности перехода из I-го состояния в остальные (I = F (x1 , x2 . . . , xn )): Q[F (x1 , x2 . . . , xn )][F (x1 + 1, x2 , . . . , xn )] = p1 , ... Q[F (x1 , x2 . . . , xn )][F (x1 , x2 , . . . , xn + 1)] = pn , Q[F (x1 , . . . , xi , . . . , xn )][F (x1 , . . . , xi − 1, . . . , xn )] = q, где i = max {j : xj > 0}, 1≤j≤n Q[F (x1 , x2 . . . , xn )][F (x1 , x2 , . . . , xn )] = r. Для вычисления среднего времени блуждания при заданном разбиении памяти нужно вычислить фундаментальную матрицу N = (E − Q)−1 [8] и просуммировать элементы первой строки, поскольку она соответствует начальному состоянию. Для нахождения оптимального разбиения памяти необходимо перебрать все возможные разбиения памяти, для каждого из них найти среднее время работы до переполнения и выбрать наибольшее время. Всего для размера памяти m и n FIFO-очередей суще(m−1)! n−1 способов разбиения [9]. ствует Cm−1 = (n−1)!(m−n)! 5. Сравнение различных способов представлений Для решения задачи разработаны программы для ЭВМ, которые реализуют вышеописанные алгоритмы. В таблице 1 приведены результаты вычислений. В строке T находится среднее время работы в случае представления в виде n FIFO-очередей, а в строках ki (1 ≤ i ≤ 4) – оптимальное разбиение памяти. В строке l1 указано время работы в случае представления в виде массива, когда размер ключа равен размеру информационной части. (На ключи тратится половина памяти). В строке l2 – когда размер ключа равен 1/2 размеру информационной части. (На ключи тратится 1/3 часть памяти). 119 В строке l4 – когда размер ключа равен 1/4 размеру информационной части. (На ключи тратится 1/5 часть памяти). В строке l8 – когда размер ключа равен 1/8 размеру информационной части. (На ключи тратится 1/9 часть памяти). Таблица 1: n = 4, m = 24. r p1 p2 p3 p4 q k1 k2 k3 k4 T l1 l2 l4 l8 0 0.15 0.15 0.15 0.15 0.4 9 6 5 4 64.3 55.05 75.01 90 100 0 0.2 0.15 0.1 0.05 0.5 13 6 3 2 234.98 182 306 420 506 0 0.05 0.1 0.15 0.2 0.5 6 7 6 5 200.46 182 306 420 506 0 0.2 0.2 0.2 0.2 0.2 7 7 6 4 27.32 21.11 27.78 32.78 36.11 0.5 0.1 0.1 0.1 0.1 0.1 7 7 6 4 54.65 42.22 55.56 65.56 72.22 0 0.4 0.1 0.05 0.05 0.4 17 3 2 2 78.32 55.05 75.01 90 100 0 0.05 0.05 0.1 0.4 0.4 5 4 6 9 68.37 55.05 75.01 90 100 0.1 0.18 0.1 0.1 0.02 0.5 13 5 4 2 1165.8 729.5 2000.45 4086.81 6506.26 Из полученных результатов можно сделать вывод, что представление приоритетной очереди в виде массива предпочтительнее использовать, если на приоритеты тратится 1/3 часть или меньше памяти. Если на приоритеты тратится половина памяти, то предпочтительнее использовать представление в виде n FIFO-очередей. Список литературы [1] Кнут Д. Искусство программирования для ЭВМ. Т. 3. — М.: Вильямс, 2001. [2] Кормен Е., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — М.:МЦНМО. 2000. 120 [3] Седжвик Р. Фундаментальные алгоритмы на С++. Анализ /Структуры данных /Сортировка/ Поиск: Пер. с англ./ Роберт Седжвик. — К.: Издательство “ДиаСофт”. 2001.– 688 с. [4] Боллапаргада В., Мэрфи К., Расс У. Структура операционной системы Cisco IOS. — М.: Вильямс. 2002. C. 163–189. [5] Аксенова Е.А., Соколов А.В. Анализ некоторых методов реализации приоритетной очереди // Межвуз. сб. “Стохастическая оптимизация в информатике.” Изд-во С.-Петербургского университета. Вып. 4. 2008. C. 61–71. [6] Феллер В. Введение в теорию вероятностей и ее приложения. — М.: Мир. 1964. [7] Тарасюк А.В. Оптимальная реализация N FIFO-очередей в памяти одного уровня в случае одновременного выполнения операций // Cистемы управления и информационные технологии. 2008. № 1 (31). C. 75–78. [8] Кемени Дж., Снелл Дж. Конечные цепи Маркова. — М.: Наука. 1970. [9] Риордан Дж. Введение в комбинаторный анализ. — М.: Издательство иностранной литературы. 1963. 121