Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 47
Текст из файла (страница 47)
5.4.4. Анализ Классический алгоритм планирования является простым и эффективным. Он вполне приемлем для систем разделения времени как класса, со смешанным выполнением интерактивных и пакетных заданий. Динамический пересчет приоритетов защищает процессы от зависания из-за недостатка процессорного времени. Традиционный метод наиболее подходит для задач, производящих большой объем ввода-вывода и требуюших небольших и нечастых «захватов» процессора.
Однако традиционный планировщик имеет ряд ограничений, которые делают его непригодным для использования с широким спектром коммерческих приложений: + он не слишком хорошо умеет масштабировать: если общее количество процессов велико, он неэффективно пересчитывает приоритеты каждую секунду; + не существует способов гарантированного предоставления части процессорного времени как ресурса определенной группе процессов или конкретному процессу; 200 Глава 5.
Планирование процессов + не существует никакого гарантированного времени реакции приложений, имеющих свойства приложений реального времени; + приложения имеют скудные возможности для управления собственным приоритетом. Механизм, работающий через значение любезности, является слишком примитивным и не отвечающим поставленным требованиям; + поскольку ядро системы является невытесняющим, высокоприоритетные готовые к выполнению процессы могут находиться в ожидании в течение довольно значительного интервала времени. Такое свойство системы называется инверсией приоритетов.
Современные системы 131ч1Х применяются в самых различных областях деятельности. В частности, существует острая необходимость в планировщике, поддерживающем приложения реального времени, которым необходимо более предсказуемое поведение и ограниченное время реакции. Решение этой проблемы потребовало провести полную переработку планировщика. Все последующие разделы главы посвящены новым средствам планирования, реализованным в системах ЯЪ'К4, Яо1аг1з 2х, ОБЕ/1 и в некоторых менее распространенных вариантах (3М1Х. 5.5. Планировщик в системе ЗЧВ4 В системе БЧК4 был представлен полностью переработанный планировщик [1], в котором разработчики попытались улучшить традиционный метод планирования. Он оказался применимым для широкого спектра приложений за счет большей гибкости и управляемости.
Ниже представлены основные качества новой архитектуры. + Поддержка более широкого диапазона приложений, в том числе и требующих работы в режиме реального времени. + Отделение политики планирования от механизма ее реализации. + Предоставление приложениям больших возможностей по управлению своими приоритетами и планированию. + Определение механизма планирования с хорошо описанным интерфейсом взаимодействия с ядром системы. + Возможность добавления новых политик планирования как отдельных модулей, включая динамически загружаемые реализации планировщика.
+ Ограничение на допустимую задержку реакции для критичных ко времени приложений. Несмотря на то что некоторые усилия были направлены на поддержку приложений реального времени, данная архитектура оказалась, в общем, дос- 5.5, Планировщик в системе Ячй4 201 таточиой для удовлетворения многих других требований планирования. Фундаментальным понятием архитектуры ЯЧВ4 явился класс планирования, определяющий политику планирования для всех процессов, относящихся к нему.
По умолчанию в системе Б'ч'В4 поддерживаются два класса: класс разделения времени и класс реального времени. Планировщик обеспечивает набор процедур, независимых от используемого класса, в которых реализованы общие службы, такие как переключение контекста, управление очередью выполнения и вытеснение. Ои также определяет процедурный интерфейс для классо-зависимых функций, таких как расчет приоритета и наследование, Для каждого класса зти функции реализоваиы по-разиому.
Например, класс реального времени использует фиксированные приоритеты, в то время как в классе разделения времени приоритет процесса изменяется динамически, как реакция иа определенные события, Этот объектно-ориентированный подход похож иа тот, который применяется в архитектуре чподе/чЬ (см. раздел 8.6) и подсистеме памяти (см. раздел 14.3). В разделе 8,6.2 показаны основные концепции объектио-ориентированного подхода, используемого в современных системах 1)Ы1Х. Согласно этому подходу, планировщик является абстрактным базовым классом, а каждый класс планирования становится его подклассом (или порожденным им классом).
5.5.1. Независимый от класса уровень Независимый от класса уровень отвечает за переключение контекста, управление очередью выполнения и вытеснение. Высокоприоритетный процесс всегда получает процессор (кроме случаев иевытесияемой обработки в ядре). Количество приоритетов увеличено до 160, и для каждого из иих теперь используется отдельная очередь. В отличие от традиционной реализации больший номер приоритета соответствует более высокому приоритету.
Однако назначение и пересчет приоритетов процессов совершается иа классо-зависимом уровне. На рис. 5.3 показаны структуры данных, используемые для управления очередью выполнения. Переменная дйасттар является битовой маской, показывающей, какая из очередей выполнения содержит по крайней мере один готовый к выполнению процесс. Для помещения процесса в очередь применяются вызовы эе11гопгой() и зе1)эасИйО, для удаления — Нзрдей(). Эти функции могут быть вызваны как из основного кода ядра, так и из классо-зависимых процедур планировщика.
Обычно очередной готовый к выполнению процесс помещается в конец своей очереди, в то время как процесс, вытесненный до окончания отведенного ему кванта времени, возвращается в начало очереди. 202 Глава 5. Планирование процессов Отдельным словом гн за Рис. 5.3. Очереди отправки на выполнение в системе ЗНН4 Главное ограничение системы (ЛхцХ, относящееся к работе приложений реального времени, заключается в невытесняющей природе ядра.
Для таких процессов необходимо, чтобы зат)ьужахг обслулсиваггия планировщикам (сттзрасстт )асепсу) (временные промежутки между моментом перехода процесса в состояние готовности к выполнению и началом его выполнения) были минимальны. Если процесс реального времени становится готовым к выполнению в то время, когда текущий процесс выполняет системный вызов, задержка перед переключением контекста может оказаться значительной. Для решения этой проблемы в ядре системы БЧК4 были определены несколько точек вытеснения.
Эти точки являются определенными местами в коде ядра, в которых все структуры данных находятся в устойчивом состоянии, а ядро системы готово начать производство большого объема операций, Когда достигается одна из точек вытеснения, ядро проверяет флаг кргцпгцл, который указывает на готовность к выполнению процесса реального времени, Если флаг установлен, ядро системы вытеснит текущий процесс. Такой подход ограничивает время ожидания процесса реального времени перед тем, как он будет назначен на выполнение'. Макроопределение РКЕЕМРТО проверяет флаг кргипгил и вызывает для вытеснения процесса процедуру ргееглрсО.
Ниже перечислены некоторые примеры точек вытеснения. + В процедуре разбора имен путей ьоокцррп(): перед началом анализа ка- ждого индивидуального компонента имени пути. + В системном вызове орел: перед созданием файла, если тот не существует. + В подсистеме памяти: перед освобождением страниц памяти, занимае- мых процессом. ' Этот код не валяется классо-эависимым, несмотря на явное упоминание процессов реального времени. Ядро только провернет йрщпгнп дли определения, должно ли оно вытеснить текущий процесс. На текунтий момент только класс реального времени устанавливает этот флаг, однако в будущем может появиться и новый класс, также требующий вытеснения процессов, работающих в режиме ядра. б.б. Планировщик в системе ЬЧВ4 203 Флаг гцпгцп используется точно так же, как в традиционных системах, и приводит к вытеснению процессов только при возврате их в режим задачи.
Функция ргеегпр(() вызывает операцию СЕ РйЕЕМРТ для выполнения классозависимых действий. Эатем она вызывает зтг(с()() для инициализации переключения контекста. Функция зуггс(т() вызывает рзау(с()О для проведения мащинно-независимой части переключения контекста, после чего вызывает подпрограммы низкого уровня' для манипуляций с контекстом регистров, очистки буферов трансляции и т.
д, Функция раас))() сбрасывает флаги гцпгцп и )гргвпгцп, выбирает самый высокоприоритетный готовый к выполнению процесс и удаляет его нз очереди отправки на выполнение. Эта функция также обновляет г(((ас()пар и устанавливает состояние процесса в значение 50г(РКОС (выполняемый на процессоре). В завершение она производит обновление регистров управления памяти, отображенных в области в, и карт трансляции адресов этого процесса.
5.5.2. Интерфейс с классами планирования Вся классо-зависимая функциональность обеспечивается через общий интерфейс, реализация виртуальных функций (см. раздел 8.6.2) которого индивидуальна для каждого класса. Интерфейс определяет как семантику этих функций, так и связи, используемые в вызове определенной реализации для класса.
На рис. 5А показана реализация классо-зависимого интерфейса. Структура с!аззТвпсз является вектором указателей на функции, реализующие классо-зависимый интерфейс какого-либо класса. В глобальной таблице классов для каждого класса отводится по одному элементу. Такой элемент содержит имя класса, указатель на функцию инициализации и указатель на вектор с(аззрц пса для этого класса. Когда процесс создается, он наследует приоритет класса от своего родителя. Впоследствии процесс может быть переведен и в другой класс при помощи системного вызова рпосп0, описанного в разделе 5.5.5. Структура ргос имеет три поля, используемых классами планирования: Идентификатор класса, являющийся индексом в глобальной таблице классов р сЫ р с!(ипсз Указатель на вектор с(аЫнпсз для класса, к которому относится процесс. Указатель копируется из соответствующего элемента глобальной таблицы классов р с(ргос Указатель на приватную классо-зависимую структуру данных Набор макроопределений преобразует вызовы, сделанные через общий интерфейс функций, в соответствующие классо-зависимые функции.
Например: Мелле С5 5ЕЕЕР(ргоср. с1ргоср....) ( (*(ргоср)->р с1гипсз- с1 з1еер)(с1ргоср, ... ) ' Автор, анлнмо, имел а виду машинно-зависимые коды. — Прим, ред. 204 Глава б. Планирование процессов Глобальная таблица символов гс с1ааатипса гс тп15 Реального времени ауа с1асатипса Системный приоритет 5У5 1П15 55 с1ааатипса Разделения времени 55 1п15 Функции инициализации Структуры ргос р с1д р с14 р с1ГОпса р с1ргсс р с1д Р С1ГОПС5 р с!ргсс р с1д р с1типс5 р с1ргсс р С1ГОПС5 р с1ргас Классо- зависимые данные Кпассо- зависимые данные Классо- аависимые данные Кпассо- зависимые данные Рис.