Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы и ответы по ОС.doc
Скачиваний:
37
Добавлен:
27.08.2019
Размер:
3.35 Mб
Скачать

23 Вопрос. Реальные алгоритмы планирования

O(1)-планировщик

При использовании планировщика O(n) время, затрачиваемое на планирование, находится в функциональной зависимости от числа задач, выполняющихся в системе.

Планировщик O(1) тратит постоянное время для того, чтобы наметить процессы в очереди готовых к запуску задач. Следовательно, можно сказать, что он имеет уровень сложности O(1). Независимо от количества активных процессов в системе, планировщик всегда затрачивает одинаковое время на их планирование.

Каждый ЦП имеет очередь задач, состоящую из некоторого количества списков, обслуживаемых в порядке FIFO и содержащих задачи, имеющие соответствующий приоритет. Задачи, запланированные к выполнению, добавляются в конец списка. Каждой задаче выделяется отрезок времени, определяющий продолжительность ее выполнения.

Помимо очереди задач ЦП, называемой активной очередью задач, существует еще неактивная очередь. После того, как задача, находящаяся в активной очереди, исчерпывает отведенный ей отрезок времени, она переносится в неактивную очередь. При переносе происходит пересчет ее отрезка времени. Если в активной очереди отсутствуют задачи с данным приоритетом, соответствующие указатели активной и неактивной очередей меняются местами; при этом неактивный список становится активным.

Работа планировщика задач не отличается сложностью: он просто выбирает задачу для выполнения из списка с наивысшим приоритетом. Чтобы повысить эффективность этого процесса, для определения наличия задач в списке используется битовый массив. Следовательно, для поиска бита, соответствующего списку с наивысшим приоритетом, можно использовать инструкцию find-first-bit-set, которую поддерживает большинство архитектур процессоров. Время, затрачиваемое на поиск задачи, зависит не от числа активных задач, а от числа приоритетов. Следовательно, этот планировщик имеет сложность O(1), поскольку время, затрачиваемое на планирование задачи, постоянно и не зависит от числа активных задач.

Completely Fair Scheduler

Полностью равномерный планировщик пытается запустить каждую задачу с "максимальной потребностью" в процессорном времени; это помогает обеспечить получение каждым процессом справедливой доли процессорного времени.

CFS использует для каждого процессора отсортированное по времени красно-чёрное дерево.

Красно-черное дерево – это тип самосбалансированного бинарного дерева, структура данных, используемая для реализации ассоциативных массивов. В красно-чёрном дереве создаётся узел для каждого работающего процесса. Процесс, находящийся в самой левой позиции чёрно-красного дерева, является следующим запланированным процессом. Красно-чёрное дерево сложно устроено, но у него хорошее время исполнения в самом худшем варианте и оно эффективно на практике: оно позволяет выполнять поиск, добавление и удаление за время O(log n), где n - количество элементов дерева. Концевые вершины не являются информативными и не содержат данных. Для экономии памяти иногда роль всех концевых вершин играет один сигнальный узел. Все ссылки с внешних узлов на концевые вершины указывают на этот сигнальный узел.

Как только задача попадает в очередь выполнения, записывается текущее время, и пока процесс ожидает освобождения процессора, его значение wait_runtime увеличивается в зависимости от количества процессов, стоящих в очереди выполнения. При выполнении этих расчётов также учитываются значения приоритета для различных задач. Когда эта задача направляется на исполнение на процессор, её значение wait_runtime начинает уменьшаться, и как только оно упадёт до такого уровня, когда другие задачи станут новыми самыми левыми задачами красно-чёрного дерева, выполнение текущей задачи прерывается. Таким образом CFS пытается достичь идеальной ситуации, когда wait_runtime будет равен нулю.

CFS не использует кванты времени так, как предыдущие планировщики. Кванты времени в CFS имеют переменную длину и определяются динамически.

Для балансировщика нагрузки модули планирования создают итераторы, которые используются для обхода задач, управляемых модулем планировщика, выполняя балансировку нагрузки.