Н.В. Вдовикина, И.В. Машечкин, А.Н. Терехин, А.Н. Томилин - Операционные системы - взаимодействие процессов (2008) (1114653), страница 11
Текст из файла (страница 11)
Вконкретной ОС эти имена могут быть другими.59Соответственно, этот процесс существует в течение всего времениработы системы и считается, что он активен, когда работает ядроОСДалее ядро копирует нулевой процесс и создает процесс сидентификатором 1.Алгоритм создания этого процесса уженапоминает стандартную процедуру, хотя и носит упрощенныйхарактер. Сначала процесс с PID = 1 представляет собой полнуюкопию процесса с PID = 0, т.е. у него тоже нет сегмента кода. Далеепроисходит увеличение размера его тела и во вновь созданнуюобласть кода копируется программа, реализующая системный вызовexec(), необходимый для выполнения программы /etc/init 10.На этом участие ядра в начальной загрузке системызавершается, однако к этому моменту еще не запущено большинствот.н. процессов-демонов и не создан ни один процесс, управляющийвходом пользователей в систему.
Обо всем этом позднеепозаботится процесс init.Если система запускается в однопользовательском режиме(для этого при запуске указывается специальный флаг), то процессinit запускает на системной консоли интерпретатор команд, темсамымпредоставляяпривилегированномупользователювозможность дополнительного конфигурирования системы илиустранения сбоев, ошибок в конфигурационных файлах и т.п.Процессinitожидает завершения работы командногоинтерпретатора, после чего продолжает свою работу.Следующий этап начальной загрузки – это выполнениекомандных файлов запуска (т.н. стартовых сценариев). Они,фактически, представляют собой обычные командные файлыкомандного интерпретатора shell, но располагаются в специальноотведенном каталоге. Системный администратор имеет возможностьконфигурировать эти файлы по своему усмотрению, но обычно онивыполняют такие задачи, как установка часового пояса, проверка имонтирование дисков, конфигурирование сетевых интерфейсов,запуск процессов-демонов и сетевых служб, включение аудита иквотирования пользователей и др.После выполнения инициализационных командных файловinit создает многопользовательскую среду.
С этой целью длякаждого активного канала связи, т.е. каждого терминала, initсоздает отдельный процесс, выполняющий команду getty. Этапрограмма выводит приглашение и ожидает попытки входа всистему. Далее, используя системный вызов exec(), gettyпередает управление программе login, проверяющей пароль. В60зависимости от результата этой проверки, login либо запускаеткомандный интерпретатор shell, осуществляющий дальнейшееобщение с пользователем на протяжении всего сеанса работы всистеме, либо возвращает управление getty для ожидания новойпопытки авторизации.Во время работы ОС процесс init ожидает завершенияодного из порожденных им процессов (т.е.
окончания сессии работыкакого-либо пользователя с системой), после чего он активизируетсяи создает для соответствующего терминала новый процесс gettyвзамен завершившегося.Таким образом, процесс initподдерживаетмногопользовательскуюсредувовремяфункционирования системы. Схема описанного “круговорота”представлена на Рис. 13initinitПосле окончанияработы shellсоздает новый gettyfork()/exec()gettyПечатает login: иожидает входа всистемувводпароляневерныйпарольокончаниеработыshellВыполняетпользовательскиепрограммыloginЗапрашиваетпароль и проверяетеговерныйпарольРис.
13 Поддержка многопользовательской работы в ОС UNIX.3.8 Планирование процессов в ОС UNIXСуществуетмножестворазнообразныхалгоритмовпланирования распределения времени центрального процессора,преследующих различные цели и отвечающих различнымкритериям. Сколь-нибудь подробный анализ хотя бы части этихалгоритмов выходит далеко за рамки данного пособия, и цельюнижеследующего рассмотрения является попытка дать читателюлишь общее представление об этой проблеме.В основе большинства UNIX-планировщиков лежит стратегияпланирования, использующая понятие приоритета.
Каждому61процессу сопоставляется некоторое целое числовое значение егоприоритета (в т.ч., возможно, и отрицательное). Общее правилотаково: чем больше числовое значение приоритета процесса, темменьше его реальный приоритет в системе (т.е. наибольшие шансызанять время ЦП будут у того процесса, у которого числовоезначение приоритета минимально).Итак, числовое значение приоритета, или просто приоритетпроцесса − это параметр, который хранится в таблице процессов, ипо значению этого параметра осуществляется выбор очередногопроцесса для продолжения работы и принимается решение оприостановке работающего процесса.Приоритеты системных и пользовательских процессов лежатв разном диапазоне и могут вычисляться по-разному.
Рассмотрим,как происходит это вычисление для пользовательского процесса.В общем случае, значение приоритета есть некоторая функцияP_PRI= F(P_NICE, P_CPU)Другими словами, в вычислении приоритета P_PRIиспользуются две изменяемые составляющие − P_NICE и P_CPU (впростейшем случае эти составляющие просто суммируются). P_NICE− это пользовательская составляющая приоритета. Его начальноезначение полагается равным системной константе NZERO, ипользовательская программа может модифицировать значениеP_NICE посредством системного вызова nice().
Аргументом этогосистемного вызова является добавка к текущему значению (дляобычного – непривилегированного − процесса эти добавкипредставляют собой неотрицательные числа). Значение P_NICEнаследуется при порождении процессов, (таким образом, значениеприоритета не может быть понижено при наследовании). Заметим,что изменяться P_NICE может только в сторону увеличения (донекоторого предельного значения), таким образом пользовательможет снижать приоритет своих процессов, оказывая своего рода«любезность» другиим пользователям.P_CPU − это системная составляющая. Она формируетсясистемой в зависимости от того, как долго выполняющийся процессзанимает ЦП, или наоборот: как долго процессы, ожидающиевыполнения.
уже находятся в очереди готовых к выполнениюпроцессов. Это может происходить, например, следующим образом:при прерывании по таймеру через предопределенные периодывремени для процесса, занимающего процессор в текущий момент,P_CPU увеличивается на единицу. Так же, как и P_NICE, P_CPU имеет62некоторое предельное значение. Если процесс будет находиться всостоянии выполнения так долго, что составляющая P_CPUдостигнет своего верхнего предела, то значение P_CPU будетсброшено в нуль, а затем снова начнет расти. Отметим, однако, чтотакая ситуация весьма маловероятна, так как скорее всего, этотпроцесс будет выгружен и заменен другим (имеющим меньшийприоритет) еще до того момента, как P_CPU достигнет максимума.Упрощенная формула вычисления приоритета таковаP_PRI= P_USER + P_NICE + P_CPUКонстанта P_USERпредставляет собой нижний порогприоритета для пользовательских процессов (что позволяетсистемным процессам всегда иметь меньшее, по сравнению спользовательскими, згачение приоритета).
Пользовательскаясоставляющая, как правило, учитывается в виде разности P_NICE NZERO, что позволяет принимать в расчет только добавку, введеннуюпосредством системного вызова nice(). Системная составляющаяучитывается с некоторым коэффициентом. Поскольку неизвестно,проработал ли до момента прерывания по таймеру текущий процессна процессоре полный интервал, прошедший с прошлогопрерыывания, то берется некоторое усреднение. Суммарнополучается следующая формула для вычисления приоритетаP_PRI= P_USER + P_NICE – NZERO + P_CPU/aЗаметим, что, если приоритет процесса не изменялся припомощи nice(), то единственной изменяемой составляющейприоритета будет P_CPU, причем эта составляющая растет толькодля того процесса, который находится в состоянии выполнения.
Втот момент, когда значение ее станет таково, что в очереди готовыхк выполнению процессов найдется процесс с меньшим значениемприоритета, выполняемый процесс будет приостановлен и замененпроцессом с меньшим значением приоритета. При этом значениесоставляющей P_CPU для выгруженного процесса сбрасывается внуль.Отметим, что в рассмотренном алгоритме наличие системнойсоставляющей, учитывающей время пребывания процесса напроцессоре, фактически позволяет рассматривать эту стратегиюпланирования как некий гибрид между «классической» схемой,основанной на «чистых» приоритетах, и схемой квантованиявремени (здесь кванты времени, которые очередной процесспроводит на ЦП, имеют переменную длину, зависящую отприоритетов остальных готовых процессов).63Пример 9. Планирование процессов.Рассмотрим два активных процесса, разделяющих процессор,причем таких, что ни их процессы-предки, ни они сами не менялисоставляющую P_NICE системным вызовом nice().
ТогдаP_NICE=NZERO и оба процесса имеют начальное значение приоритетаP_PRI=P_USER, так как для них обоих в начальный момент P_CPU=0.Пусть прерывание по таймеру происходит через N единиц времени, икаждый раз значение P_CPU увеличивается на единицу, а ввычислениеприоритетасоставляющаяP_CPUвходитскоэффициентом 1/A. Таким образом, дополнительная единица вприоритете процесса, занимающего процессор, «набежит» через Атаймерных интервалов.
Значение P_CPU второго процесса остаетсянеизменным, и его приоритет остается постоянным. Через NA единицвремени разница приоритетов составит единицу в пользу второгопроцесса и произойдет смена процессов на процессоре.64ЧАСТЬ III. РЕАЛИЗАЦИЯ ВЗАИМОДЕЙСТВИЯ ПРОЦЕССОВВ этой части будет рассмотрен широкий спектр средствмежпроцессноговзаимодействия,которыепредоставляютпрограммисту операционные системы семейства UNIX.
Отметим,что многие из этих средств (такие как сигналы, средства IPC,сокеты, MPI) или их аналоги имеются и в других операционныхсистемах. Таким образом, данное рассмотрение будет полезно вцелом для формирования представления о многообразии механизмоввзаимодействия процессов, теоретические основы которых былирассмотрены ранее.Средства межпроцессного взаимодействия ОС UNIXпозволяют строить прикладные системы различной топологии,функционирующие как в пределах одной локальной ЭВМ, так и впределах сетей ЭВМ.Прирассмотрениилюбыхсредствмежпроцессноговзаимодействия возникает необходимость решения двух проблем,связанных с организацией взаимодействия процессов: проблемыименованиявзаимодействующихпроцессовипроблемысинхронизации процессов при организации взаимодействия.Рассмотрим их подробнее.При организации любого взаимодействия мы сталкиваемся снеобходимостью выбора пространства имен процессов-отправителейи получателей или имен некоторых объектов, через которыеосуществляется взаимодействие.