приоритетные очереди - PullRequest
       29

приоритетные очереди

1 голос
/ 07 октября 2011

При чтении темы о приоритетных очередях в Структуры данных и алгоритмы я натолкнулся на следующий абзац ...

один из возможных способов поддержки коротких процессов, но не блокироватьдлинные - дать процессу P приоритет 100 t(used)-t(init), где t(used) - время, затрачиваемое процессом, а t(init) - время, в которое процесс инициирован, измеренное с некоторого значения time 0.Обратите внимание, что 100 - это магическое число, так как оно выбрано несколько большим, чем наибольшее число процессов, которые мы ожидаем одновременно активными.Читатель может заметить, что если мы всегда выбираем процесс с наименьшим номером приоритета и в миксе не слишком много коротких процессов, то в долгосрочной перспективе процесс, который не завершится быстро, получит 1% времени процессора.

Может кто-нибудь объяснить, как этот процесс занимает 1%?было бы хорошо, если бы вы могли получить результат математически.

1 Ответ

1 голос
/ 07 октября 2011

Конечно, поэтому изначально любой процесс имеет отрицательное значение приоритета. Неважно, что это, только то, что оно отрицательно и основано на текущем времени, как бы то ни было. Для простоты предположим, что это просто целочисленное значение.

Процесс A начинается с приоритетом 0 (предположим, что мы находимся в момент времени t = 0). Он выполняется, скажем, 10 единиц времени, но не завершен, поэтому его необходимо поставить в очередь, чтобы продолжить обработку в будущем. Так что приоритет будет, исходя из формулы

priority = priority + 100*(endtime - starttime)

priorityA = 0 + 100*(10-0)
priorityA = 1000

Первоначальный приоритет процесса B инициализируется при t = 5, поэтому он равен -5. У него самый низкий из двух приоритетов в очереди, поэтому у него тоже будет время. Предположим, что он также работает в течение 10 единиц времени. После этого B будет иметь приоритет:

priorityB = -5 + 100*(20-10)
priorityB = 995

и он снова встанет в очередь. И давайте предположим, что он снова работает на 10 единиц. По его расписанию новый приоритет будет:

priorityB = 995 + 100*(30-20)
priorityB = 1995

Так что это переместит B после A в приоритетной очереди. Затем запускается, но на этот раз работает только 5 единиц времени. Это новый приоритет:

priorityA = 1000 + 100*(35-30)
priorityA = 1500

И процесс А снова будет наверху очереди и привлечет внимание. Предположим, он снова работает в течение 5 единиц времени, его новый приоритет:

priorityA = 1500 + 100(40-35)
priorityA = 2000

, который будет позиционировать его после процесса B, и поэтому B получит некоторое время процессора. Давайте предположим, что на этот раз он использует 5 единиц времени.

priorityB = 1995 + 100(45-40)
priorityB = 2495

Теперь настала очередь А. Посмотрите, как эти два процесса эффективно получают 50% внимания процессора каждый? Если мы добавим в процесс третий длительный процесс («длительный», как A и B, «длительный» в том смысле, что они не работают в течение 10 блоков, а затем завершат, а скорее поставили в очередь), эти процессы каждый из них, вероятно, получит примерно 33% времени процессора, поскольку каждый раз, когда он запускается и не завершается, его приоритет корректируется в зависимости от того, сколько времени он провел. Новые процессы всегда запускаются первыми в этом сценарии, потому что они имеют отрицательное значение приоритета и на самом деле получат более высокий (более низкое числовое значение) приоритет какое-то время. Однако это не будет длиться вечно - новые процессы начнут получать все большее и большее значение приоритета.

Но так как мы получили, основываясь на допущениях, сделанных для примера книги, около 100 процессов одновременно, ожидающих некоторого времени обработки, а также предположения о том, что не слишком много краткосрочных процессов, будет как правило, около 100 процессов требуют внимания процессоров, поэтому каждый из них будет получать примерно одинаковое количество времени, и вскоре их относительные числовые значения приоритетов будут сгруппированы вокруг друг друга (то есть числовая разница не отличается от той, что имеет наивысший приоритет и один с наименьшим приоритетом), и поэтому после запуска «верхнего» процесса к его приоритету будет добавлено достаточно, чтобы подтолкнуть его вниз (или около дна). Промыть и повторить, и вы, по сути, получите круговой механизм, предполагая, что все они используют примерно одинаковое количество времени каждый обход. В каждый момент времени их около 100, поэтому, опять-таки, если предположить, что существует несколько краткосрочных процессов, каждый из них получает 1/100 внимания процессора.

...