Жизненный цикл процесса

Алгоритм работы процессов в ОС определяется следующими условиями:

  1. имеется запущенный процесс;
  2. каждый процесс может запускать подпроцессы;
  3. создание нового процесса создается клонированием исходного;
  4. прародителем всех процессов в системе является процесс init, запускаемый ядром ОС при загрузке;
  5. процессы взаимодействуют между собой посредством межпроцессного взаимодействия:
  • каналы;
  • сигналы;
  • сокеты;
  • разделяемая память;
  1. каждый процесс обладает свойствами (процесс обладает контекстом):
  • PID – идентификатор процесса;
  • PPID – идентификатор процесса, породившего данный процесс;
  • UID и GID – идентификаторы прав процесса (соответствует UID и GID пользователя, от имени которого запущен процесс);
  • приоритет процесса;
  • состояние процесса (выполнение, сон и т.п.).

Типичный процесс в Linux может быть представлен схемой (Рисунок 11).

Рисунок 11 - Схема жизненного цикла процесса в ОС

Этапы состоят из следующих шагов:

  1. процесс /bin/bash клонирует себя системным вызовом fork();
  2. при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID, равный PID родителя;
  3. клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код кодом исполняемого файла родительский процесс при этом ждет завершения потомка wait();
  4. если по каким-то причинам потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться zombie.

Первый процесс в Системе запускается при инициализации ядра. Данный процесс называется init и имеет PID=1 – это прародитель всех процессов в Системе.

Каждый запущенный процесс в любой момент времени может находиться в одном из следующих состояний (которое называют еще статусом процесса):

  • Активен (R=Running)– находится в очереди на выполнение, то есть либо выполняется в данный момент, либо ожидает выделения ему очередного кванта времени центрального процессора.
  • "Спит" (S=Sleeping)– находится в состоянии прерываемого ожидания, то есть ожидает какого-то события, сигнала или освобождения нужного ресурса.
  • Непрерываемое ожидание (D=Direct) – ожидает определенного ("прямого") сигнала от аппаратной части и не реагирует на другие сигналы;
  • Приостановлен (T) – находится в режиме трассировки (обычно такое состояние возникает при отладке программ);
  • "Зомби" (Z=Zombie) – выполнение завершилось, но относящиеся к нему структуры ядра по каким-то причинам не освобождены. Одной из причин их появления в Системе может быть следующая ситуация: обычно освобождение структур ядра, относящихся к процессу, выполняет процесс-родитель после получения от потомка сигнала о завершении. Но бывают случаи, когда родительский процесс завершается раньше дочернего.
  • Сироты – не имеют родителя, автоматически "усыновляются" процессом init, который и принимает сигналы об их завершении. Если процесс-родитель или init по каким-то причинам не может принять сигнал о завершении дочернего процесса, то процесс-потомок превращается в "зомби" и получает статус "Z". Процессы-"зомби" не занимают процессорного времени (т. е. их выполнение прекращается), но соответствующие им структуры ядра не освобождаются. В некотором смысле это "мертвые" процессы. Уничтожение таких процессов одна из обязанностей системного администратора. Появление данных процессов говорит о том, что в Системе что-то не в порядке, и зачастую проблема кроется в аппаратной части ПК. В этом случае необходимо проводить тестирования MHDD (например, с memtest).

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