Операционные системы/Реализация процессов в ОС UNIX. Определение процесса

Материал из eSyr's wiki.

Версия от 20:25, 22 января 2010; Nexor (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Содержание

[править] Системно-ориентированные определения процесса

В любой системе, оперирующей понятием процесс, существует системно-ориентированное определение процесса (определение, учитывающее конкретные особенности данной ОС).

С точки зрения Unix выделяют два системно-ориентированных определения процесса:

  1. Процесс – объект, зарегистрированный в таблице процессов ОС
  2. Процесс – объект, порожденный системным вызовом fork()

Рассмотрим данные определения процесса Unix.

[править] Таблица процессов

Каждый процесс характеризуется уникальным именем – идентификатором процесса (PID). PID – целое число от 0 до некоторого предельного значения, определяющего максимальное число процессов, существующих в системе одновременно.

Будем использовать термины 0й процесс, 1й процесс, 125й процесс, это означает, что речь идет о процессах с PID = 0, 1, 125. 0й процесс в системе ассоциируется с работой ядра Unix. С точки зрения организации данных PID – номер строки в таблице, в которой размещена запись о процессе.

[править] Контекст процесса

Содержимое записи таблицы процессов позволяет получить контекст процесса (часть данных контекста размещается непосредственно в записи таблицы процессов, на оставшуюся часть контекста имеются прямые или косвенные ссылки, также размещенные в записи таблицы процессов).

С точки зрения логической структуры, контекст процесса Unix состоит из:

  • пользовательской составляющей или тела процесса (иногда используется термин пользовательский контекст)
  • аппаратной составляющей (иногда используется термин аппаратный контекст)
  • системной составляющей (системный контекст)

Иногда два последних компонента объединяют, в этом случае используется термин общесистемная составляющая контекста.

Тело процесса состоит из сегмента кода и сегмента данных.

Сегмент кода содержит машинные команды и неизменяемые константы соответствующей процессу программы.

Сегмент данных содержит данные, динамически изменяемые в ходе выполнения кода процесса. Сегмент данных содержит область статических переменных, область разделяемой с другими процессами памяти, а также область стека (обычно эта область служит основой для организации автоматических переменных, передачи параметров в функции, организацию динамической памяти).

Некоторые современные ОС имеют возможность разделения единого сегмента кода между идентичными процессами. Тем самым достигается экономия памяти в случаях одновременного выполнения идентичных процессов.

Например, при функционировании терминального класса одновременно могут быть сформированы несколько копий текстового редактора. В этом случае сегмент кода у всех процессов, соответствующих редакторам, будет единый, а сегменты данных будут у каждого процесса свои.

Следует отметить, что при использовании динамически загружаемых библиотек возможно разделение сегмента кода на неизменную часть, которая может разделяться между процессами и часть, соответствующую изменяемому в динамике коду подгружаемых программ.

Аппаратная составляющая содержит все регистры и аппаратные таблицы ЦП, используемые активным или исполняемым процессом (счетчик команд, регистр состояния процессора, аппарат виртуальной памяти, регистры общего назначения и т. д.).

Обращаем внимание, что аппаратная составляющая имеет смысл только для процессов, находящихся в состоянии выполнения. Для процессов, находящихся в других состояниях содержимое составляющей не определено.

В системной составляющей контекста процесса содержатся различные атрибуты процесса, такие как:

  • идентификатор родительского процесса;
  • текущее состояние процесса;
  • приоритет процесса;
  • реальный идентификатор пользователя-владельца (идентификатор пользователя, сформировавшего процесс);
  • эффективный идентификатор пользователя-владельца (идентификатор пользователя, по которому определяются права доступа процесса к файловой системе);
  • реальный идентификатор группы, к которой принадлежит владелец (идентификатор группы к которой принадлежит пользователь, сформировавший процесс);
  • эффективный идентификатор группы, к которой принадлежит владелец (идентификатор группы «эффективного» пользователя, по которому определяются права доступа процесса к файловой системе);
  • список областей памяти;
  • таблица открытых файлов процесса;
  • информация о том, какая реакция установлена на тот или иной сигнал (аппарат сигналов позволяет передавать воздействия от ядра системы процессу и от процесса к процессу);
  • информация о сигналах, ожидающих доставки в данный процесс;
  • сохраненные значения аппаратной составляющей (когда выполнение процесса приостановлено).

Пользовательский контекст находится в адресном пространстве процесса; системный и аппаратный контексты – в адресном пространстве ядра Unix.

[править] Аппарат системных вызов в OC UNIX

Второе определение процесса в Unix: Процесс в ОС Unix – это объект, порожденный системным вызовом fork(). Данный системный вызов является единственным стандартным средством порождения процессов в системе Unix. Ниже рассмотрим возможности данного системного вызова подробнее.

Нас будут интересовать следующие типы системных вызовов:

  • для создания процесса;
  • для организации ввода вывода;
  • для решения задач управления;
  • для операции координации процессов;
  • для установки параметров системы.

Отметим некоторые общие моменты, связанные с работой системных вызовов.

Большая часть системных вызовов определены как функции, возвращающие целое значение, при этом при нормальном завершении системный вызов возвращает 0, а при неудачном завершении -1. При этом код ошибки можно выяснить, анализируя значение внешней переменной errno, определенной в заголовочном файле <errno.h>.

В случае, если выполнение системного вызова прервано сигналом, поведение ОС зависит от конкретной реализации. Например, в BSD UNIX ядро автоматически перезапускает системный вызов после его прерывания сигналом, и таким образом, внешне никакого различия с нормальным выполнением системного вызова нет. Стандарт POSIX допускает и вариант, когда системный вызов не перезапускается, при этом системный вызов вернет –1, а в переменной errno устанавливается значение EINTR, сигнализирующее о данной ситуации.

См. также Реализация процессов в ОС UNIX. Базовые средства управления процессами в ОС UNIX.

Личные инструменты
Разделы