Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 52
Текст из файла (страница 52)
В некоторых случаях (например, в предыдущем примере) нить может удерживать несколько объектов. Тогда ее унаследованный приоритет будет равняться максимальному значению из всех приоритетов, наследуемых от этих объектов. Когда нить освобождает какой-либо объ- 220 Глава Б. Планирование процессов ект, ее приоритет пересчитывается на основе оставшихся удерживаемых ею объектов. Такие сокращения наследованного приоритета могут привести к тому, что приоритет этой нити станет меньше, чем приоритет другой, готовой к выполнению нити, которая в конечном счете вытеснит первую.
Вылолняе гп = глобаль приорит нп - "унаслед приори Ресурсы Блокированные нити Рис. Б.10. Наследование приоритетов 5.6. 6 . Ограничения наследования приоритетов Наследование приоритетов следует использовать только в случаях, когда мы знаем, какая из нитей собирается освободить ресурс. Это возможно, когда ресурс удерживается единственной известной нам нитью.
В системе Зо!агЬ 2л поддерживается четыре типа объектов синхронизации: взаимные исключения (шцсех), семафоры, условные переменные и защелки чтения/записи (более подробно эти объекты будут рассмотрены в главе 7). При применении взаимных исключений владелец ресурса всегда известен', Однако при использовании семафоров или условных переменных владелец обычно не определяется, следовательно, наследование приоритетов не используется. Это является неприятным моментом, так как условные переменные часто применяются в сочетании со взаимными исключениями, реализуя тем самым высокоуровневые конструкции синхронизации, а некоторые из последних имеют определяемых владельцев.
' Владельца молгио определить через функцию юотех оипед. — Прим. Ред. 5.6. Расширенные возможности планирования системы 8о!айв 2.х 221 Если защелка чтения/записи закрывается для записи, то владелец один, и он известен'. Однако ресурс может удерживаться сразу несколькими читающими нитями. Пишущая нить должна блокироваться до тех пор, пока все текущие читающие нити не освободят объект. В этом случае объект не имеет единственного владельца, а хранить указатели на всех владельцев непрактично.
В системе эо!аг1з для решения подобной проблемы предусмотрено определение обладателя записи (отчпег-о1-гесоге1), которым является первая читающая нить, получившая защелку и переключившая тем самым ее в режим разрешения доступа «только на чтение». Если высокоприоритетная пишущая нить блокируется в ожидании этого объекта, нить владельца записи унаследует ее приоритет. Когда нить владельца записи освободит объект, возможна ситуация, что какие-либо другие неопределенные читающие нити еще удерживают защелку в режиме чтения.
Эти нити не могут унаследовать приоритет пишущей нити. Таким образом, предлагаемое решение является ограниченным, но остается удобным, так как во многих ситуациях удержание защелки производится всего лишь одной читающей нитью. Наследование приоритетов уменьшает время блокирования высокоприоритетного процесса, находящегося в ожидании ресурсов, удерживаемых низкоприоритетными процессами. Однако в самом худшем случае величина задержки по-прежнему остаегся достаточно большой, не удовлетворяя требования многих приложений реального времени.
Одной из причин этого является тот факт, что цепочка блокирования способна достигать весьма больших размеров. Другой причиной может послужить наличие в высокоприоритетном процессе нескольких критических участков кода, на каждом нз которых может происходить блокирование, что в сумме может привести к значительным задержкам. Этой проблеме уделяется большое внимание среди разработчиков. Появились ее альтернативные решения, например сег11пй-протокол (се111пй ргоеосо1, см. 116]). Протокол контролирует захват ресурсов процессами для гарантии того, что высокоприоритетный процесс блокируется в ожидании ресурса, удерживаемого низкоприоритетным процессом, не более чем один раз при каждой активации.
Хотя такой подход ограничивает задержки блокировки для высокоприоритетных процессов, он заставляет низкоприоритетные процессы чаще блокироваться. Он также требует априорного знания обо всех процессах системы и их требованиях относительно ресурсов. Описанные недостатки сужают область применимости протокола, оправдывая его только для небольшого круга приложений. 5.6.7. Турникеты Ядро содержит сотни объектов синхронизации, по одному для каждой структуры данных, которую необходимо защищать отдельно. Такие объекты должны хранить огромные объемы информации, например очереди нитей, на них ' Тот, кто пишет, — Прим. ред, 222 Глава 5. Планирование процессов блокированных. Содержание большой структуры данных для каждого объекта является расточительным, поскольку хотя в ядре находятся и сотни таких объектов, но только несколько из них используются в один конкретный момент.
В системе Бо1аг1з применяется эффективное решение этой проблемы при помощи турникетов. Объект синхронизации содержит указатель на турникет, в котором находятся все данные, необходимые для манипулирования объектом, например очереди блокированных нитей и указатель на нить, владеющую ресурсом в текущий момент (рис. 5,11). Турникеты выделяются динамически из пула, который растет в размере по мере увеличения количества нитей в системе.
Турникет предоставляется первой нити, которой необходимо заблокировать объект. Когда более не остается блокированных на объекте нитей, турникет освобождается и возвращается обратно в пул. 22~.О Ю 2 2 Объекты синхронизации Рис. 5.11. Турникеты В традиционных системах !)1ч1Х ядро связывает с каждым ресурсом или событием, на котором процесс может заблокироваться, особый канал сна (см. раздел 7.2.3). Канал обычно представляет собой адрес, связанный с ресурсом или событием. Ядро хэширует процесс в очередь сна, основанную на этом канале ожидания. Поскольку разные каналы ожидания могут отображаться в одну и ту же очередь сна, время, затрачиваемое на ее просмотр, ограничивается только общим количеством нитей системы. В ОС Бо1аг1з 2л этот механизм заменен турникетами, которые ограничивают очередь сна количеством нитей, блокированных на конкретном ресурсе, что дает более разумные границы времени, затрачиваемого на обработку очереди.
Нити внутри турникета выстроены в порядке их приоритетов. Объекты синхронизации поддерживают два способа разблокировки: сигнал', который ' Функциональность этих сигналов не имеет никакого отношения к традиционным сигтшлаи системы ПЧ! Х. Так как в гтЫ!Х принято использовать терминологию из нескольких источниковв, некоторые термины системы обладают несколькими значениями.
5.7. Планирование в системе Масо 223 пробуждает определенную спящую нить, или широковещательное сообщение (Ьгоаг1сазг), которое будит все нити, блокированные в ожидании ресурса. В системе Бо1аг1з сигнал будит наиболее высокоприоритетную нить очереди. 5.6.8. Анализ В системе Бо!аг1з 2т представлена сложная среда поддержки многонитевой обработки и обработки в режиме реального времени — как для однопроцессорных, так и для многопроцессорных систем. В Бо1апз были устранены некоторые недостатки, присушие механизму планирования в БЪ'К4.
Измерения, произведенные на Врагсзгаг1оп 1, показали, что задержки обслуживания планировщиком в большинстве случаев не превышали 2 миллисекунд. Такое значение является следствием полностью вытесняюшего ядра и наследования приоритетов. Несмотря на то что в Во1аг1з имеются средства, подходяшие для большинства приложений реального времени, она является главным образом операционной системой общего назначения.
Система, создаваемая специально для приложений реального времени, должна поддерживать такие дополнительные возможности, как групповое планирование процессоров, планирование по крайним срокам или планирование, основанное на приоритетах операций устройств ввода-вывода. Эти возможности будут описаны в разделе 5.9. Рассмотрим несколько алгоритмов планирования, применяемых в коммерческих и экспериментальных вариантах системы ОЫ1Х.
5.7. Планирование в системе Масп МасЬ является многонитевой операционной системой, поддерживающей многопроцессорные системы. Она разработана для применения в любых типах компьютеров — от однопроцессорных машин до массивно-параллельных систем, содержащих сотни процессоров и разделяющих между собой единое адресное пространство. Из этого следует, что планировщик ОС МасЬ должен подходить для всех возможных целей применения 121.
Основные понятия системы — задачи и нити — были описаны в разделе 3.7. Нить является главной единицей планирования и система планирует выполнение нитей безотносительно задачи, к которой они относятся. Такой подход снижает производительность, поскольку переключение контекста между нитями одной задачи происходит намного быстрее по отношению к переключению нитей, относящихся к различным задачам (из-за того, что в первом случае не нужно производить изменение карт управления памятью).
Однако политика, которая поошряет переключение нитей внутри процесса, может противоречить целям баланса загрузки и использования системы. Более того, различия производительности двух типов контекстного переключения могут оказаться малозначительными в зависимости от применяемого аппаратного обеспечения и запущенных приложений. 224 Глава 5. Планирование процессов Каждая нить наследует базовый приоритет планирования от задачи, к которой она относится. Этот приоритет сочетается с фактором использования процессора, который хранится и ведется отдельно для каждой нити. Система МасЬ уменьшает степень использования процессора для каждой нити посредством умножения ее на 5/8 каждой секунды простаивания нити. Алгоритм снижения является распределенным.
Каждая нить отслеживает уровень собственного использования процессора и пересчитывает его при пробуждении после блокирования. Обработчик прерываний таймера регулирует фактор использования текущей нити. Для предупреждения зависания (из-за недостатка процессорного времени) низкоприоритетных нитей, продолжающих оставаться в очереди на выполнение без возможности пересчета своих приоритетов, каждые 2 секунды запускается внутренняя нить ядра, которая пересчитывает приоритеты всех готовых к выполнению нитей. Назначенная на выполнение нить выполняется в течение определенного кванта времени. По исчерпании этого промежутка она может быть вытеснена другой нитью, обладающей равным или большим приоритетом.
Перед тем как израсходуется начальный квант у текущей нити, ее приоритет может быть понижен по отношению к другим готовым к выполнению нитям. Однако в системе МасЬ такие изменения не приведут к переключению контекста раньше, чем нить исчерпает свой квант.