А. Робачевский - Операционная система UNIX (1114671), страница 46
Текст из файла (страница 46)
По этой же причине,обработка прерываний не должна блокироваться, поскольку это вызоветблокирование выполнения независимого процесса.Напротив, особые ситуации вызваны самим процессом, и связаны с вы!полнением тех или иных инструкций, например, деление на ноль или об!ращение к несуществующей странице памяти.
Таким образом, обработкаособых ситуаций производится в контексте процесса, при этом может ис!пользоваться его адресное пространство, а сам процесс — при необходи!мости блокироваться (перемещаться в состояние сна).Системные вызовы позволяют процессам воспользоваться базовыми услу!гами ядра. Интерфейс системных вызовов определяет ограниченный наборточек входа в ядро системы, обращение к которым изменяет режим вы!полнения процесса и позволяет выполнять привилегированные инструк!ции ядра. Стандартная библиотека С, позволяющая использовать систем!ные функции как обычные процедуры, на самом деле содержит заглушки,обеспечивающие фактическую реализацию вызова соответствующей точкивхода ядра.
Эта реализация существенным образом зависит от аппаратнойархитектуры системы. Например, для систем на базе процессоров Intel ис!пользуются шлюзы (gate). Имеются два типа шлюзов: шлюзы ловушек (trapgate) и шлюзы вызовов (call gate). Для осуществления вызова через шлюзловушки процесс выполняет команду прерывания, а при работешлюз вызова — команду межсегментного вызова.www.books-shop.com234Глава 3.процессамиВыполнение системного вызова происходит в режиме ядра, но в контекстепроцесса, сделавшего системный вызов. Таким образом, открыт доступ кадресному пространству процесса и используется стек ядра процесса.Сон и пробуждениеПроцесс обычно переводится в состояние сна при обработке системнойфункции. Если для завершения обработки запроса требуется недоступныйресурс, процесс снимается с процессора и переводится в состояние сна.Недоступность ресурса может быть связана с запуском операции вво!да/вывода с диска, ожиданием выделения (освобождения) буфера, ожида!нием ввода или вывода на терминал или ожиданием завершения дочернегопроцесса.
К недоступным ресурсам можно также отнестивпамяти страницу, к виртуальному адресу которой обратился процесс. Влюбом случае процесс переходит в состояние сна до наступления события,делающего ресурс доступным. Во время сна процесс не потребляет вычис!лительные ресурсы системы. При этом выполняется переключение кон!текста на другой, высокоприоритетный процесс для выполнения. Такимобразом, процесс, ожидающий ввода с клавиатуры, не занимает процес!сор, циклически опрашивая терминальную линию, а процесс, считываю!щий данные с диска, не блокирует выполнение других задач.Состояние сна — это логическое состояние процесса, при этом он не пе!ремещается физически в памяти. Переход в состояние сна в первую оче!редь определяется занесением в системную таблицу процессов соответст!вующего флага состояния и события, пробуждающего процесс.События возвещают о доступности того или иного ресурса.
Как правилособытия связаны с работой периферийных устройств, таких как диск, тер!минал и принтер, поэтому об их наступлении сигнализируют соответст!вующие аппаратные прерывания. Наступления одного и того же событияможет ожидать несколько процессов. Поскольку переход из состояния всостояние акт скорее логический, то и пробуждаются все эти процессыодновременно.
Однако это не означает, что какой!либо один из них сразуначнет выполняться. Это лишь приводит к тому, что их состояние меняет!ся от "сна" к "готов к выполнению", и они помещаются в очередь на за!пуск. Задачу выбора процесса для запуска затем решает планировщик про!цессов.События, в ожидании которых "засыпают" процессы, не являются равно!ценными.Во!первых, они различаются по вероятности наступления. Например со!бытие, связанное с завершением операции ввода с диска или освобожде!нием буфера, имеет высокую вероятность. Как правило, подобные опера!ции имеют конечное время выполнения, в противном случае система ока!www.books-shop.comЗавершение выполнения процесса235залась бы заблокированной.
С другой стороны, вероятность наступлениясобытия, связанного с вводом с терминала, может быть весьма низкой.Пользователь может надолго оставить терминал, не завершив сеанса рабо!ты с системой. В длительном ожидании события нет ничего опасного —процесс не занимает ресурсы процессора, однако без специальных мервыключение терминала приведет к блокировке этого устройства. Для тогочтобы избежатьситуации, должна существовать возможностьвывести процесс из состояния сна, несмотря на отсутствие ожидаемогособытия. В этом случае используется стандартное решение — отправлениепроцессу сигнала. В противоположность этому, отправление сигнала про!цессу, ожидающему операции ввода с диска, может привести к ухудшениюпроизводительности системы. Поэтому все события и связанные с н и м иресурсы разделяются на две категории по вероятности их наступления: надопускающие прерывание сигналом и на не допускающие таковых.Во!вторых, процессы, разбуженные событием, должны иметь различнуювероятность запуска.
Это, в первую очередь, связано с тем, что несколькоресурсов могут отображаться на одно событие. Например, процесс А, ожи!дающий завершения операции ввода с диска, и процесс В, ожидающийосвобождения буфера ввода, будут связаны с одним и тем же событием.Они оба окажутся "разбуженными" и затем "готовыми к запуску" после за!вершения этой операции. Если процесс В будет запущен первым, он всеравно не сможет выполняться, так как буфер не освобожден процессом А.Даже в случае, когдапроцессы связаны с различными событиями,необходимо отдавать предпочтение процессу с более ценным ресурсом.Например, освобождение буфера ввода безусловно предпочтительнее за!вершения ввода с терминала.Поскольку планировщик принимает решение о запуске процесса, основы!ваясь на приоритетах, единственным способом установить "справедливый"порядок запуска процессов является присвоение определенного приорите!та каждому событию.
Приоритет процесса и его влияние на планированиедостаточно подробно обсуждались в разделе "Контекст процесса".Завершение выполнения процессаПроцесс завершает свое выполнение с помощью функции exitЭтафункция может быть вызвана системным вызовома если заверше!ние процесса вызвано получением сигнала, функциювызываетсамо ядро. Функция exitвыполняет следующие действия:Отключает все сигналы.Закрывает все открытые файлы.Сохраняет статистикукод возврата в записиресурсов итаблицы процессов.www.books-shop.com236ППППГлава 3.управления процессамиИзменяет состояние процесса на "зомби".Делает процессродительским для всех потомков данногопроцесса.Освобождает адресное пространство процесса, u!area, карты отобра!жения и области свопинга, связанные с процессом.Отправляет сигналродительскому процессу, уведомляя егоо "смерти" потомка.Пробуждает родительский процесс, если тот ожидает завершения по!томка.Запускает функцию переключения контекста, в результате чего вы!сокоприоритетный процесс получает доступ к вычислительным ре!сурсам.После завершения выполнения функции exitпроцесс находится в со!стоянии "зомби".
При этом от процесса остается записьв таблицепроцессов, содержащая статистику использования вычислительных ресур!сов и код возврата. Эта информация может потребоваться родительскомупроцессу, поэтому освобождение структурыпроизводит родитель спомощью системного вызовавозвращающего статистику и код воз!врата потомка. Если родительский процесс заканчивает свое выполнениераньше потомка, "родительские права" переходят к процессуВэтом случае после смерти потомкаделает системный вызови освобождает структуруДругая ситуация возникает, если потомок заканчивает свое выполнениераньше родителя, а родительский процесс не производит вызоваВэтом случае структурапотомка не освобождается и процесс продол!жает находиться в состоянии "зомби" до перезапуска операционной систе!мы.
Хотя такой процесс (которого, вообще говоря, не существует) не по!требляет ресурсов системы, он занимает место в таблице процессов, темсамым уменьшая максимальное число активных задач.СигналыВ некотором смысле сигналы обеспечивают простейшую форму межпро!цессного взаимодействия, позволяя уведомлять процесс или группу про!цессов о наступлении некоторого события.
Мы уже рассмотрели в преды!дущих главах сигналы с точки зрения пользователя и программиста. Те!перь мы остановимся на обслуживании сигналов операционной системой.Группы и сеансыГруппы процессов и сеансы уже обсуждались в главе 2. Такое представле!ние набора процессов используется в UNIX для управления доступом кwww.books-shop.comСигналы237терминалу и поддержки пользовательских сеансов работы в системе.
Пере!числим еще раз наиболее важные понятия, связанные с группами и сеан!сами.Группа процессов. Каждый процесс принадлежит определенной груп!пе процессов. Каждая группа имеет уникальный идентификатор.Группа может иметь в своем составе лидера группы — процесс, чейидентификатор PID равен идентификатору группы. Обычно процесснаследует группу от родителя, но может покинуть ее и организоватьсобственную группу.Управляющий терминал. Процесс может быть связан с терминалом,который называется управляющим. Все процессы группы имеютодин и тот же управляющий терминал.Специальный файл устройства /dev/tty. Этот файл связан с управ!ляющим терминалом процесса.
Драйвер для этого псевдоустройствапо существу перенаправляет запросы на фактический терминальныйдрайвер, который может быть различным для различных процессов.Например, два процесса, принадлежащие различным сеансам, от!крывая файл /dev/tty, получат доступ к различным терминалам.Управление сигналамиСигналы обеспечивают механизм вызова определенной процедуры принаступлении некоторого события.
Каждое событие имеет свой идентифи!катор и символьную константу. Некоторые из этих событий имеют асин!хронный характер, например, когда пользователь нажимает клавишу <Del>или <Ctrl>+<C> для завершения выполнения процесса, другие являютсяуведомлением об ошибках и особых ситуациях, например, при попыткедоступа к недопустимому адресу или вызовы недопустимой инструкции.Различные события, соответствующие тем или иным сигналам, подробнорассматривались в главе 2.Говоря о сигналах необходимо различать две фазы этого механизма — ге!нерация или отправление сигнала и его доставка и обработка.
Сигнал от!правляется, когда происходит определенное событие, о наступлении кото!рого должен быть уведомлен процесс. Сигнал считаетсякогда процесс, которому был отправлен сигнал, получает его и выполняетего обработку. В промежутке между этими двумя моментами сигнал ожи!даетОтправление сигналаЯдро генерирует и отправляет процессу сигнал в ответ на ряд событий,которые могут быть вызваны самим процессом, другим процессом, преры!ванием или какими!либо внешними событиями. Можно выделить основ!ные причины отправки сигнала:www.books-shop.com238Глава 3.управления процессамиОсобые ситуацииКогда выполнение процесса вызывает особуюситуацию, например, деление на ноль, процессполучает соответствующий сигнал.ТерминальныепрерыванияНажатие некоторых клавиш терминала, напри!мер,<Ctrl>+<C> или <Ctrl>+<\>, вызы!вает отправление сигнала текущему процессу,связанному с терминалом.Другие процессыПроцесс может отправить сигнал другому про!цессу или группе процессов с помощью систем!ного вызова kill(2).
В этом случае сигналы яв!ляются элементарной формой межпроцессноговзаимодействия.УправлениезаданиямиКомандные интерпретаторы, поддерживающиесистему управления заданиями, используютсигналы для манипулирования фоновым и те!кущими задачами. Когда процесс, выполняю!щийся в фоновом режиме делает попытку чте!ния или записи на терминал, ему отправляетсясигнал останова. Когда дочерний процесс за!вершает свою работу, родитель уведомляется обэтом также с помощью сигнала.КвотыКогда процесс превышает выделенную ему кво!ту вычислительных ресурсов или ресурсов фай!ловой системы, ему отправляется соответст!вующий сигнал.УведомленияПроцесс может запросить уведомление о насту!плении тех или иных событий, например, го!товности устройства и т.