Процесс может быть создан только системным вызовом fork()

Процесс, выполняющий системный вызов fork(), называется порождающим или отцом (предком), а созданный этим вызовом процесс – порожденным или сыном (потомком).

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

Полученный после компиляции объектный модуль (файл) состоит из процедурного сегмента и сегмента данных. Потенциально существует ещё два сегмента – динамический и стек, но они не занимают места на диске. Эти сегменты создаются в момент загрузки исполнимого файла (полученного из объектного модуля) в оперативную память.

Процедурный сегмент содержит машинные инструкции (команды) и константы. Как правило, он не изменяется во время выполнения исполнимой программы.

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

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

Объектные файлы объединяются редактором связей (компоновщиком) ld в исполнимый файл. В общем случае образ процесса (исполнимый файл) загружается и подвергается свопингу полностью.

Порождение процессов в ОС Unix. Методы организации параллельных процессов.

Порождение процессов

Образ процесса – это совокупность составляющих его сегментов.

При создании процесса строится образ порожденного процесса, являющегося точной копией образа породившего процесса.

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

Процедурный сегмент копируется только тогда, когда НЕ является разделяемым. В противном случае сын становится ещё одним процессом, разделяющим данный процедурный сегмент.

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

Чтобы процесс мог опознать, является он отцом или сыном, системный вызов fork() возвращает в качестве своего значения в породивший процесс идентификатор порожденного процесса, а в порожденный процесс – нуль.

Следует обратить внимание на следующее обстоятельство:

· процессы не имеют предопределенных заранее описанных имен или идентификаторов.

· идентификатор процесса никак не связан с именем программы, выполняемой процессом.

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

1) Порожденный процесс выполняет ту же программу, что и порожденный процесс. Однако процессы выполняют различные части программы (см. выше оператор switch).

Например, порожденный процесс выполняет только коды для альтернативы с меткой case, а порожденный процесс - только коды для альтернативы с меткой default. Этот метод приводит к нерациональному использованию памяти, так как в ней содержатся коды программы, которые не будут выполняться. Более того, использование такого метода может привести к непредсказуемым ошибкам, так как порождающий, так и порожденный процессы могут изменять данные одного и того же файла и выполнять операции чтения и записи с одним и тем же каналом.

2). Порождающий процесс продолжает выполнение исходной программы, а порожденный процесс выполняет другую программу, которая перекрывается с исходной.

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

Сигналы. Система прерываний процесса. Сигналы ОС Unix.

Сигналы

Операционная среда, создаваемая ядром Unix, имитирует для каждого процесса систему прерываний.

Сигналы Unix – средство, с помощью которого ядро или какой-либо процесс могут уведомлять определенный процесс о наступлении того или иного события. Получив сигнал, процесс обязан предпринять соответствующие действия. (В некотором смысле сигналы соответствуют прерываниям в MS-DOS).

К типичным событиям, которые могут заставить процесс принять сигнал, относятся:

·аппаратные прерывания, например ввод с клавиатуры или поступления данных с последовательного порта;

·нарушение нормального выполнения программы;

·тайм-аут;

·сбой оборудования;

·попытка выполнить недопустимую команду;

выход из порожденного процесса.

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

Ряд сигналов нельзя перехватить; они обрабатываются стандартными программами (обычно это приводит к прекращению выполнения процесса, принявшего сигнал). В различных версиях Unix определены 30-40 сигналов. Некоторые из этих сигналов приводятся ниже.

SIGHUP Ситуация, аналогичная прерыванию соединения или остановке процесса
SIGINT Сигнал прерывания
SIGQUIT Сигнал завершения работы
SIGILL Недопустимая команда
SIGTRAP Останов в контрольной точке в процессе отладки
SIGFPE Исключительная ситуация при обработке данных с плавающей точкой
SIGKILL Удаление процесса (перехватить или игнорировать невозможно)
SIGBUS Ошибка обмена с шиной данных процессора
SIGSYS Неправильный аргумент при системном вызове
SIGALRM Сигнал «будильника»
SIGTERM Завершение программы
SIGUSR1 Пользовательский сигнал 1
SIGUSR2 Пользовательский сигнал 1
SIGPWR Сбой питания/перезапуск

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

Синхронные сигналы чаще всего приходят от системы прерываний процесса и свидетельствуют о действиях процесса, блокируемых аппаратурой (сигналы 4-8, 10, 11).

Асинхронные сигналы возникают при использовании системного вызова kill() или команды kill. По умолчанию ядро Unix обрабатывает стандартную реакцию на сигнал, которая сводится к завершению процесса. Иными словами, если возникает сигнал, то процесс завершается.

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