Билеты (Graur) (1114774), страница 13
Текст из файла (страница 13)
КонтекстВ любой системе, оперирующей понятием процесс, существует системноориентированное определение процесса (определение, учитывающее конкретныеособенности данной ОС).С точки зрения Unix системно-ориентированное определение процесса:ПроцессОбъект, зарегистрированный втаблице процессов ОСОбъект, порожденный системнымвызовом fork()Рассмотрим данные определения процесса Unix.Процесс в ОС Unix – объект (не надо путать с объектом ООП!!!),зарегистрированный в таблице процессов Unix.Таблица процессовКаждый процесс характеризуется уникальным именем – идентификаторомпроцесса (PID). PID – целое число от 0 до некоторого предельного значения,определяющего максимальное число процессов, существующих в системеодновременно.Будем использовать термины 0й процесс, 1й процесс, 125й процесс, это означает,что речь идет о процессах с PID = 0, 1, 125.
0й процесс в системе ассоциируется сработой ядра Unix. С точки зрения организации данных PID – номер строки втаблице, в которой размещена запись о процессе.Контекст процессаСодержимое записи таблицы процессов позволяет получить контекст процесса(часть данных контекста размещается непосредственно в записи таблицыпроцессов, на оставшуюся часть контекста имеются прямые или косвенные ссылки,также размещенные в записи таблицы процессов).С точки зрения логической структуры контекст процесса Unix состоит из: пользовательской составляющей или тела процесса (иногда используетсяпользовательский контекст) аппаратной составляющей (иногда используется аппаратный контекст) системной составляющей ОС Unix (иногда – системный контекст)Иногда два последних компонента объединяют, в этом случае используется терминобщесистемная составляющая контекста.Тело процесса состоит из сегмента кода и сегмента данных.Сегмент кода содержит машинные команды и неизменяемые константысоответствующей процессу программы.Сегмент данных – содержит данные, динамически изменяемые в ходе выполнениякода процесса.
Сегмент данных содержит область статических переменных,область разделяемой с другими процессами памяти, а также область стека (обычноэта область служит основой для организации автоматических переменных,передачи параметров в функции, организацию динамической памяти).Некоторые современные ОС имеют возможность разделения единого сегментакода между разными процессами. Тем самым достигается экономия памяти вслучаях одновременного выполнения идентичных процессов.Например, при функционировании терминального класса одновременно могутбыть сформированы несколько копий текстового редактора.
В этом случае сегменткода у всех процессов, соответствующих редакторам, будет единый, а сегментыданных будут у каждого процесса свои.Следует отметить, что при использовании динамически загружаемых библиотеквозможно разделение сегмента кода на неизменную часть, которая можетразделяться между процессами и часть, соответствующую изменяемому вдинамике коду подгружаемых программ.Аппаратная составляющая содержит все регистры и аппаратные таблицы ЦП,используемые активным или исполняемым процессом (счетчик команд, регистрсостояния процессора, аппарат виртуальной памяти, регистры общего назначения ит.
д.).Обращаем внимание, что аппаратная составляющая имеет смысл только дляпроцессов, находящихся в состоянии выполнения. Для процессов, находящихся вдругих состояниях содержимое составляющей не определено.Системная составляющая.В системной составляющей контекста процесса содержатся различные атрибутыпроцесса, такие как:- идентификатор родительского процесса;- текущее состояние процесса;- приоритет процесса;- реальный идентификатор пользователя-владельца (идентификаторпользователя, сформировавшего процесс);- эффективный идентификатор пользователя-владельца (идентификаторпользователя, по которому определяются права доступа процесса кфайловой системе);- реальный идентификатор группы, к которой принадлежит владелец(идентификатор группы к которой принадлежит пользователь,сформировавший процесс);- эффективный идентификатор группы, к которой принадлежит владелец(идентификатор группы «эффективного» пользователя, по которомуопределяются права доступа процесса к файловой системе);- список областей памяти;-таблица открытых файлов процесса;информация о том, какая реакция установлена на тот или иной сигнал(аппарат сигналов позволяет передавать воздействия от ядра системыпроцессу и от процесса к процессу);информация о сигналах, ожидающих доставки в данный процесс;сохраненные значения аппаратной составляющей (когда выполнениепроцесса приостановлено).Рассмотрим второе определение процесса Unix.Процесс в ОС Unix – это объект, порожденный системным вызовом fork().Данный системный вызов является единственным стандартным средствомпорождения процессов в системе Unix.
Ниже рассмотрим возможности данногосистемного вызова подробнее.Аппарат системных вызов в OC UNIX.Привилегированный и обычный режим(есть набор инструкций, доступный толькоиз привил.)Чтобы работать в с ресурсами ВС – переход в привел. Системныевызовы, предоставляемые ОС UNIX. К интересующим нас вызовам относятсявызовы- для создания процесса;- для организации ввода вывода;- для решения задач управления;- для операции координации процессов;- для установки параметров системы.Отметим некоторые общие моменты, связанные с работой системныхвызовов.Большая часть системных вызовов определены как функции, возвращающие целоезначение, при этом при нормальном завершении системный вызов возвращает 0, апри неудачном завершении -14.
При этом код ошибки можно выяснить, анализируязначение внешней переменной errno, определенной в заголовочном файле<errno.h>.В случае, если выполнение системного вызова прервано сигналом, поведение ОСзависит от конкретной реализации. Например, в BSD UNIX ядро автоматическиперезапускает системный вызов после его прерывания сигналом, и таким образом,внешне никакого различия с нормальным выполнением системного вызова нет.Стандарт POSIX допускает и вариант, когда системный вызов не перезапускается,при этом системный вызов вернет –1, а в переменной errno устанавливаетсязначение EINTR, сигнализирующее о данной ситуации.4БИЛЕТ 24Базовые средства организации и управленияпроцессамиДля порождения новых процессов в UNIX существует единая схема, с помощьюкоторой создаются все процессы, существующие в работающем экземпляре ОСUNIX, за исключением первых двух процессов (0-го и 1-го).Для создания нового процесса в операционной системе UNIX используетсясистемный вызов fork(), в результате в таблицу процессов заносится новая запись,и порожденный процесс получает свой уникальный идентификатор.
Для новогопроцесса создается контекст, большая часть содержимого которого идентичнаконтексту родительского процесса, в частности, тело порожденного процессасодержит копии сегментов кода и данных его родителя. Сыновний процесснаследует от родительского процесса: окружение - при формировании процесса ему передаетсянекоторый набор параметров-переменных, используя которые,процесс может взаимодействовать с операционным окружением(интерпретатором команд и т.д.); файлы, открытые в процессе-отце, за исключением тех, которымбыло запрещено передаваться процессам-потомкам с помощьюзадания специального параметра при открытии. (Речь идет о том,что в системе при открытии файла с файлом ассоциируетсянекоторый атрибут, который определяет правила передачи этогооткрытого файла сыновним процессам.
По умолчанию открытые в«отце» файлы можно передавать «потомкам», но можно изменитьзначение этого параметра и блокировать передачу открытых впроцессе-отце файлов.); способы обработки сигналов; разрешение переустановки эффективного идентификаторапользователя; разделяемые ресурсы процесса-отца; текущий рабочий каталог и домашний каталоги и т.д.По завершении системного вызова fork() каждый из процессов –родительский и порожденный – получив управление, продолжат выполнение содной и той же инструкции одной и той же программы, а именно с той точки, гдепроисходит возврат из системного вызова fork(). Вызов fork() в случае удачногозавершения возвращает сыновнему процессу значение 0, а родительскому PIDпорожденного процесса.
Это принципиально важно для различения сыновнего иродительского процессов, так как сегменты кода у них идентичны. Таким образом,у программиста имеется возможность разделить путь выполнения инструкций вэтих процессах.В случае неудачного завершения, т.е. если сыновний процесс не былпорожден, системный вызов fork() возвращает –1, код ошибки устанавливается впеременной errno.Пример.Программа создает два процесса – процесс-предок распечатывает заглавные буквы,а процесс-потомок строчные.int main(int argc, char **argv){char ch, first, last;int pid;if((pid=fork())>0){/*процесс-предок*/first =’A’;last =’Z’;}else{/*процесс-потомок*/first =’a’;last =’z’;}for (ch = first; ch <= last; ch++){write(1,&ch,1);}_exit(0);}Механизм замены тела процесса.Семейство системных вызовов exec() производит замену тела вызывающегопроцесса, после чего данный процесс начинает выполнять другую программу,передавая управление на точку ее входа. Возврат к первоначальной программепроисходит только в случае ошибки при обращении к exec() , т.е.
если фактическойзамены тела процесса не произошло.Заметим, что выполнение “нового” тела происходит в рамках уже существующегопроцесса, т.е. после вызова exec() сохраняется идентификатор процесса, иидентификатор родительского процесса, таблица дескрипторов файлов, приоритет,и большая часть других атрибутов процесса. Фактически происходит заменасегмента кода и сегмента данных. Изменяются следующие атрибуты процесса:- режимы обработки сигналов: для сигналов, которые перехватывались,после замены тела процесса будет установлена обработка по умолчанию,т.к.