Самодел 1 (1114716), страница 21
Текст из файла (страница 21)
• хотя бы одну выполняемую нить.
Контекст процесса.
Текущее состояние любого процесса из БОП изменяется во времени в зависимости от самого процесса и состояния ОС. С каждым из процессов из БОП система ассоциирует совокупность данных, характеризующих актуальное состояние процесса – контекст процесса. (в общем случае контекст процесса содержит информацию о текущем состоянии процесса, включая информацию о режимах работы процессора, содержимом регистровой памяти, используемой процессом, системной информации ОС, ассоциированной с данным процессом).
Процессы, находящиеся в одном из состояний ожидания в своих контекстах содержат всю информацию, необходимую для продолжения выполнения - состояние процесса в момент прерывания (копии регистров, режимы ОП, настройки аппарата виртуальной памяти и т. д.). Соответственно при смене выполняемого процесса ОС осуществляет «перенастройку» внутренних ресурсов ЦП, происходит смена контекстов выполняемых процессов.
На этапе выполнения процесса ОС обеспечивает возможность корректного взаимодействия процессов от передачи сигнальных воздействий от процесса к процессу до организации корректной работы с разделяемыми ресурсами.
Контекст процесса может состоять из:
•пользовательской составляющей – состояние программы, как совокупности машинных команд и данных, размещенных в ОЗУ;
•системной составляющей
– информация идентификационного характера
(PID процесса, PID «родителя»…)
– информация о содержимом регистров
( РОН, индексные регистры, флаги...
– информация, необходимая для управления процессом
(состояние процесса,
Процессы в ОС Unix
Системно-ориентированное определение процесса
В любой системе, оперирующей понятием процесс, существует системно-ориентированное определение процесса (определение, учитывающее конкретные особенности данной ОС).
Таблица ограничена => количество процессов в таблице ограниченно => количество процессов ограничено.
«Первое» определение процесса в ОС Unix
Процесс в ОС Unix – объект, зарегистрированный в таблице процессов Unix.
Каждый процесс характеризуется уникальным именем – идентификатором процесса (PID). PID – целое число от 0 до некоторого предельного значения, определяющего максимальное число процессов (ресурс данной ОС), существующих в системе одновременно.
Если это максимальное число превышено, то начать обрабатывать еще один процесс невозможно.
Будем использовать термины 0й процесс, 1й процесс, 125й процесс, это означает, что речь идет о процессах с PID = 0, 1, 125. 0й процесс в системе ассоциируется с работой ядра Unix. С точки зрения организации данных PID – номер строки в таблице, в которой размещена запись о процессе.
Контекст процесса
Содержимое записи таблицы процессов позволяет получить контекст процесса (часть данных контекста размещается непосредственно в записи таблицы процессов, на оставшуюся часть контекста имеются прямые или косвенные ссылки, также размещенные в записи таблицы процессов).
С точки зрения логической структуры контекст процесса Unix состоит из:
•пользовательской составляющей или тела процесса (иногда используется пользовательский контекст)
•аппаратной составляющей , в которой отражается актуальное состояние компьютера при выполнении процесса. В зависимости от состояния процесса, аппаратный компонент либо представляется содержимым соответствующих регистров настройки ЦП, либо, если процесс отложен, то аппаратный компонент копируется ОС в свои таблицы (в системную составляющую)
•системной составляющей ОС Unix (иногда – системный контекст)
Иногда два последних компонента объединяют, в этом случае используется термин общесистемная составляющая контекста.
Тело процесса состоит из сегмента кода и сегмента данных.
Пользовательская составляющая (тело процесса)
Сегмент кода
•Машинные команды
•Неизменяемые константы
Сегмент данных
Статические данные
• Статические переменные
Разделяемая память
• Фактические параметры в функциях
• Автоматические переменные
• Динамическая память
Стек
Сегмент кода содержит машинные команды и неизменяемые константы соответствующей процессу программы. Стек используется для перемещения фактических параметров.
Сегмент данных – содержит данные, динамически изменяемые в ходе выполнения кода процесса. Сегмент данных содержит область статических переменных, область разделяемой с другими процессами памяти, а также область стека (обычно эта область служит основой для организации автоматических переменных, передачи параметров в функции, организацию динамической памяти).
Реальные и эффективные идентификаторы пользователя и группы. Как правило при формировании процесса эти идентификаторы совпадают и равны реальному идентификатору пользователя и реальному идентификатору группы, т.е. они определяются персонификацией пользователя, сформировавшего данный процесс. При этом права процесса по доступу к файловой системе определяются правами сформировавшего процесс пользователя и его группы. Этого бывает недостаточно. Примером может служить ситуация, когда пользователь желает запустить некоторый процесс, изменяющий содержимое файлов, которые не принадлежать этому пользователю (например, изменение пароля на доступ пользователя в систему). Для разрешения данной ситуации имеется возможность установить специальный признак в исполняемом файле, наличие которого позволяет установить в процессе, сформированном при запуске данного файла в качестве эффективных идентификаторов, идентификатор владельца и группы владельца этого файла.
Разделение сегмента кода
э кономия памяти в случае одновременного выполнения идентичных процессов
Некоторые современные ОС имеют возможность разделения единого сегмента кода между разными процессами. У процессов общий сегмент кода, но разные сегменты данных. Тем самым достигается экономия памяти в случаях одновременного выполнения идентичных процессов.
Например, при функционировании терминального класса одновременно могут быть сформированы несколько копий текстового редактора. В этом случае сегмент кода у всех процессов, соответствующих редакторам, будет единый, а сегменты данных будут у каждого процесса свои.
Следует отметить, что при использовании динамически загружаемых библиотек возможно разделение сегмента кода на неизменную часть, которая может разделяться между процессами и часть, соответствующую изменяемому в динамике коду подгружаемых программ.
Аппаратная составляющая
• Все регистры и аппаратные таблицы ЦП, используемые активным или исполняемым процессом
• счетчик команд
• регистр состояния процессора
• аппарат виртуальной памяти
• регистры общего назначения
и т. д.
Обращаем внимание, что аппаратная составляющая имеет смысл только для процессов, находящихся в состоянии выполнения. Для процессов, находящихся в других состояниях содержимое составляющей не определено.
Системная составляющая.
содержимое регистров и режимов работы процессора, настройки аппарата защиты памяти, виртуальной памяти, принадлежащие процессу ресурсы (как физические, так и виртуальные).
В системной составляющей контекста процесса содержатся различные атрибуты процесса, такие как:
- идентификатор родительского процесса;
- текущее состояние процесса (выполняется, отложен и т.д.);
- приоритет процесса;
- реальный идентификатор пользователя-владельца (идентификатор пользователя, сформировавшего процесс);
- эффективный идентификатор пользователя-владельца (идентификатор пользователя, по которому определяются права доступа процесса к файловой системе);
- реальный идентификатор группы, к которой принадлежит владелец (идентификатор группы к которой принадлежит пользователь, сформировавший процесс);
- эффективный идентификатор группы, к которой принадлежит владелец (идентификатор группы «эффективного» пользователя, по которому определяются права доступа процесса к файловой системе);
- список областей памяти;
- таблица открытых файлов процесса (токже является ресурсом данной системы);
- информация о том, какая реакция установлена на тот или иной сигнал (аппарат сигналов позволяет передавать воздействия от ядра системы процессу и от процесса к процессу);
- информация о сигналах, ожидающих доставки в данный процесс;
- сохраненные значения аппаратной составляющей (когда выполнение процесса приостановлено).
Некоторые пояснения.
Реальные и эффективные идентификаторы пользователя и группы. Как правило при формировании процесса эти идентификаторы совпадают и равны реальному идентификатору пользователя и реальному идентификатору группы, т.е. они определяются персонификацией пользователя, сформировавшего данный процесс. При этом права процесса по доступу к файловой системе определяются правами сформировавшего процесс пользователя и его группы. Этого бывает недостаточно. Примером может служить ситуация, когда пользователь желает запустить некоторый процесс, изменяющий содержимое файлов, которые не принадлежать этому пользователю (например, изменение пароля на доступ пользователя в систему). Для разрешения данной ситуации имеется возможность установить специальный признак в исполняемом файле, наличие которого позволяет установить в процессе, сформированном при запуске данного файла в качестве эффективных идентификаторов, идентификатор владельца и группы владельца этого файла.
Базовые средства организации и управления процессами
Второе определение процесса Unix.
Системный вызов – специальная функция, позволяющая процессу обращаться к ядру ОС за выполнением тех или иных действий.
Это может быть запрос на выполнение операций обмена, управления процессами, получения системной информации и т.п. При выполнении системного вызова в процессе происходит инициация специального прерывания «обращение к системе» . В разных системах детали реализации системного вызова могут отличаться друг от друга и название прерывания «обращение к системе» здесь выбрано достаточно условно. В любом случае использование системного вызова влечет за собой накладные расходы, связанные со сменой контекста выполняющегося в данный момент процесса.
Если системный вызов не выполняется или выполняется нештатно, то он возвращает –1 в коде ответа и в переменной errno будет находится код причины отказа (для диагностирования результатов выполнения системного вызова в процессе используется переменная errno, объявленная в файле errno.h).
Процесс в ОС Unix – это объект, порожденный системным вызовом fork().
Данный системный вызов является единственным стандартным средством порождения процессов в системе Unix.
Ниже рассмотрим возможности данного системного вызова подробнее.
Создание нового процесса
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
Для порождения новых процессов в UNIX существует единая схема, с помощью которой создаются все процессы, существующие в работающем экземпляре ОС UNIX, за исключением первых двух процессов (0-го и 1-го)
Для создания нового процесса в операционной системе UNIX используется системный вызов fork().