Читаем Операционная система UNIX полностью

АтрибутНаследование потомком (fork(2))Сохранение при запуске программы (exec(2))
Сегмент кода (text)Да, разделяемыйНет
Сегмент данных (data)Да, копируется при записи (copy-on-write)Нет
ОкружениеДаВозможно
АргументыДаВозможно
Идентификатор пользователя UIDДаДа
Идентификатор группы GIDДаДа
Эффективный идентификатор пользователя EUIDДаДа (Нет, при вызове setuid(2))
Эффективный идентификатор группы EGIDДаДа (Нет, при вызове setgid(2))
ID процесса (PID)НетДа
ID группы процессовДаДа
ID родительского процесса (PPID)НетДа
Приоритет nice numberДаДа
Права доступа к создаваемому файлуДаДа
Ограничение на размер файлаДаДа
Сигналы, обрабатываемые по умолчаниюДаДа
Игнорируемые сигналыДаДа
Перехватываемые сигналыДаНет
Файловые дескрипторыДаДа, если для файлового дескриптора не установлен флаг FD_CLOEXEC (например, с помощью fcntl(2))
Файловые указателиДа, разделяемыеДа, если для файлового дескриптора не установлен флаг FD_CLOEXEC (например, с помощью fcntl(2))

В общем случае вызов fork(2) выполняет следующие действия:

□ Резервирует место в области свопинга для сегмента данных и стека процесса.

□ Размещает новую запись proc в таблице процессов и присваивает процессу уникальный идентификатор PID.

□ Инициализирует структуру proc (поля структуры proc подробно рассматривались в разделе "Структуры данных процесса").

□ Размещает карты отображения, необходимые для трансляции адреса.

□ Размещает u-area процесса и копирует ее содержимое с родительского.

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

□ Инициализирует аппаратный контекст процесса, копируя его с родительского.

□ Устанавливает в ноль возвращаемое дочернему процессу вызовом fork(2) значение.

□ Устанавливает возвращаемое родительскому процессу вызовом fork(2) значение равным PID потомка.

□ Помечает процесс готовым к запуску и помещает его в очередь на выполнение.

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

Для решения данной проблемы используются два подхода. Первый из них, предложенный в UNIX System V, называется "копирование при записи" (copy-on-write или COW). Суть этого подхода заключается в том, что сегменты данных и стека родительского процесса помечаются доступными только для чтения, а дочерний процесс, хотя и получает собственные карты отображения, разделяет эти сегменты с родительским. Другими словами, сразу после создания процесса и родитель и потомок адресуют одни и те же страницы физической памяти. Если какой-либо из двух процессов попытается модифицировать данные или стек, возникнет страничная ошибка, поскольку страница открыта только для чтения, а не для записи. При этом будет запущен обработчик ошибки ядра, который создаст для процесса копию этой страницы, доступную для записи. Таким образом, фактическому копированию подлежат только модифицируемые страницы, а не все адресное пространство процесса. Если дочерний процесс делает системный вызов exec(2) или вообще завершает свое выполнение, права доступа к страницам родителя, имеющим флаг COW, возвращаются к их прежним значениям (т.е. до создания дочернего процесса), а флаг COW очищается.

Перейти на страницу:

Похожие книги

Архитектура операционной системы UNIX (ЛП)
Архитектура операционной системы UNIX (ЛП)

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

Морис Дж Бах , Морис Дж. Бах

ОС и Сети, интернет / ОС и Сети / Книги по IT