Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 18
Текст из файла (страница 18)
Алгоритм блокировки ресурсов ' Более поздние версии системы ())Ч!Х поддерживагот несколько альтернативных вариантов вызова па)георц, таких как иаье опе() и иавергосзО. 80 Глава 2. Ядро и процессы 2.5.2. Прерывания Несмотря на то что ядро системы защищено от вытеснения другим процессом, процесс, манипулирующий структурами ядра, может быть прерван различными устройствами. Если обработчик прерывания попытается получить доступ к таким структурам, то обнаружит, что они находятся в состоянии нарушения целостности.
Возникшую проблему можно решить при помощи блокировки прерываний на период доступа к критически важным структурам данных. Ядро использует триггеры, приведенные в табл. 2.1 для повышения уровня )р1 и блокировки всех прерываний. Такие области кодов называются критическими секциями (см. пример в листинге 2.1). Листинг 2.1. Блокировка прерываний для критических областей )пС х = вр1Ь!о(): /* повышает уровень зр!.
возвращает предыдущее значение !р! */ / * изиенеиие дискового каша * / /* восстанавливает предшествующий уровень !р1 */ зр!х(х): При маскировании прерываний следует учитывать следующие важные соображен)гя: +Прерывания обычно требуют незамедлительной обработки, следовательно, они не могут удерживаться слишком долго. Таким образом, критические области кода должны быть по возможности краткими и малочисленными. + Необходимо блокировать только те прерывания, обработка которых требует обращения к данным, использующимся в критической области. В приведенном примере целесообразно блокировать только дисковые прерывания.
+ Два различных прерывания могут иметь один и тот же уровень приоритета. Например, на многих системах прерывания терминала и диска происходят на уровне )р! 21. + Блокирование прерывания приводит к блокированию всех прерываний, имеющих такой же или более низкий уровень приоритета. ПРИМЕЧАНИЕ При описании подсистем ОМ!Х слово «блокирование» употребляется а нескольких различных значениях. Процесс блокируется на ресурсе или событии, переходя в спящий режим и ожидая освобождения необходимого ресурса или наступления события. Ядро блокирует прерывание или сигнал, задерживая на время его передачу. И наконец, подсистема ввода-вывода передает данные на устройства хранения или от них в блоках фиксированного размера. 2.6.
Планирование процессов 81 2.5.3. Многопроцессорные системы Появление многопроцессорных систем стало причиной возникновения нового класса проблем синхронизации. Зашита ядра, основанная на отсутствии вытеснения, здесь уже не может быть применена. В однопроцессорных системах ядро может производить манипуляции с большинством структур данных, не опасаясь за их целостность, так как работа ядра не может быть вытеснена никем. Необходимо защищать только те данные, которые могут оказаться доступны обработчикам прерываний, а также те, целостность которых зависит от работы вызова Меер(). В многопроцессорных системах два процесса в состоянии одновременно выполняться в режиме ядра на разных процессорах', а также выполнять параллельно одну и ту же функцию. Таким образом, каждый раз, когда ядро обращается к глобальным структурам данных, оно должно защищать их от получения актуна с других процессоров.
Сами механизмы защиты также должны быть~защищены от особенностей выполнения в многопроцессорных системах/Если два процесса, выполняющиеся на различных процессорах, попытаются одновременно заблокировать один и тот же объект, только один должен завершить успешно зту процедуру. Зашита от прерываний является достаточно сложной задачей, так как все процессоры могут обрабатывать прерывания. Нецелесообразно производить блокировку на каждом процессоре, так как это чревато значительным снижением производительности системы. Многопроцессорные системы требуют более сложных механизмов синхронизации, которые будут подробнее описаны в главе 7.
2.6. Планирование процессов Центральный процессор представляет собой ресурс, который используется всеми процессами системы. Часть ядра, распределяющая процессорное время между процессами, называется планировщиком (зсЬег)ц1ег). В традиционных системах 1Л»11Х планировщик использует принцип вытесняюи~го циклического планирования. Процессы, имеющие одинаковые приоритеты, будут выполняться циклически друг за другом, и каждому из них будет отведен для зтого определенный период (квант) времени, обычно равный 100 миллисекундам.
Если какой-либо процесс, имеющий более высокий приоритет, становится выполняемым, то он вытеснит текущий процесс (конечно, если тот не выполняется в режиме ядра) даже в том случае, если текущий процесс не исчерпал отведенного ему кванта времени. В традиционных системах (11м'1Х приоритет процесса определяется двумя факторами: фактором «любезности» и фактором утилизации. Пользователи ' Под словом «многопроцессорных», автор, видимо, имел в виду двухпроцессорную систему,— Прим.
ред. 82 Глава 2. Ядро и процессы Таблица 2.2, Приоритеты сна е ОС 4.3ВВО Оы!Х Приоритет Значение Описание Свопинг Страничный демон Другие действия по обработке памяти Ожидание освобождения 1побе Ожидание дискового ввода-вывода Ожидание освобождения буфера Базовый приоритет Ожидание ввода с терминала Ожидание вывода с терминала Р5У2Р Р51УР» 1 Р51УР + 1/2/4 Р1КОО РК1810 РК1810+ 1 Р2ЕКО ТПРК1 !/2/4 10 20 21 28 28 29 ТТОРК1 ' Из-за отказа операционной системы его обслуживать. — Прим. дед, могут повлиять на приоритет процесса при помощи изменения значения его «любезности», используя системный вызов п1се (но только суперпользователь имеет полномочия увеличивать приоритет процесса).
Фактор утилизации определяется степенью последней (то есть во время последнего обслуживания процесса процессором) загруженности СРТ) процессом. Этот фактор позволяет системе динамически изменять приоритет процесса. Ядро системы периодически повышает приоритет процесса, пока тот не выполняется, а после того, как процесс все-таки получит какое-то количество процессорного времени, его приоритет будет понижен. Такая схема зашищает процессы от «зависания»', так как периодически наступает такой момент, когда ожидающий процесс получает достаточный уровень приоритета для выполнения. Процесс, выполняюшийся в режиме ядра, может освободить процессор в том случае, если произойдет его блокирование по событию или ресурсу. Когда процесс снова станет работоспособным, ему будет назначен приоритет ядра.
Приоритеты ядра обычно выше приоритетов любых прикладных задач. В традиционных системах Т)й11Х приоритеты представляют собой целые числа в диапазоне от О до 127,причем чем меньше их значение, тем выше приоритет процесса (так как система Т)М1Х почти полностью написана на языке С, в ней используется стандартный подход к началу отсчета от нуля). Например, в ОС 4.3ВБВ приоритеты ядра варьируются в диапазоне от О до 49, а приоритеты прикладных задач — в диапазоне от 50 до 127. Приоритеты прикладных задач могут изменяться в зависимости от степени загрузки процессора, но приоритеты ядра являются фиксированными величинами и зависят от причины засыпания процесса.
Именно по этой причине приоритеты ядра также известны как приоритеты сна. В табл. 2.2 приводятся примеры таких приоритетов для операционной системы 4.ЗВБР ТЛь11Х. Более подробно работа планировщика будет изложена в главе 5. 2.7. Сигналы 83 Приоритет Значение Описание Ожидание завершения процесса-потомка Консультативное ожидание блокированного ресурса Ожидание сигнала 30 35 РВА1Т РЕОЕК Р5ЕЕР 40 2.?.
Сигналы Для информирования процесса о возникновении асинхронных событий или необходимости обработки исключительных состояний в системе Т)Х1Х используются сигналы. Например, когда пользователь нажимает на своем терминале комбинацию клавиш СЕТ1+С, процессу, с которым пользователь в данный момент интерактивно работает, передается сигнал 5161МТ.
Когда процесс завершается, он отправляет своему процессу-родителю сигнал 516СНС0. В ОС 1)М1Х поддерживается определенное количество сигналов (31 в 4.3ВБР и 5"у'КЗ). Большинство из них зарезервированы для специальных целей, однако сигналы 5160581 и 5161)5й2 доступны для использования в приложениях в произвольном назначении.
Сигналы используются для многих операций. Процесс может выслать сигнал одному или нескольким другим процессам, используя системный вызов К116 Драйвер терминала вырабатывает сигналы в ответ на нажатия клавиш или происходящие события для процессов, присоединенных к нему. Ядро системы вырабатывает сигналы для уведомления процесса о возникновении аппаратного исключения или в случаях возникновения определенных ситуаций, например превышения квот.
Каждый сигнал имеет определенную по умолчанию реакцию на него, обычно это завершение процесса. Некоторые сигналы по умолчанию игнорируются, а небольшая часть из них приостанавливает процесс. Процесс может указать системе на необходимость иной реакции на сигналы, отличной от заданной по умолчанию. Для этого используется вызов ейдпа1(5узтеш Ч), 51дуес (ВБР) или 51дасйоп (РО51Х.1). Действия, отличные от принятых по умолчанию,могут заключаться в запуске обработчика сигнала, определенного разработчиком приложения, его игнорировании, а иногда и в процедурах, противоположных тем, что производятся в обычных случаях.