Процесс может быть создан только системным вызовом 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 обрабатывает стандартную реакцию на сигнал, которая сводится к завершению процесса. Иными словами, если возникает сигнал, то процесс завершается.
Стандартная реакция на сигнал предусматривает завершение процесса, которому предназначался сигнал.