Основы операционной системы UNIX

         

Создание процесса


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

Порожденный процесс наследует от родительского процесса следующие основные характеристики:

  • Способы обработки сигналов (адреса функций обработки сигналов).
  • Реальные и эффективные идентификаторы пользователя и группы.
  • Значение поправки приоритета.
  • Все присоединенные разделяемые сегменты памяти.
  • Идентификатор группы процессов.
  • Терминальную линию.
  • Текущий каталог.
  • Корневой каталог.
  • Маска создания файлов (umask).
  • Ограничения ресурсов (ulimit).
  • Порожденный процесс отличается от родительского процесса следующими основными характеристиками:



  • Порожденный процесс имеет свой уникальный идентификатор.
  • Порожденный процесс имеет другой идентификатор родительского процесса, равный идентификатору породившего процесса.
  • Порожденный процесс имеет свои собственные копии дескрипторов файлов (в частности, стандартных потоков), открытых родительским процессом. Каждый дескриптор файла порожденного процесса имеет первоначально такое же значение текущей позиции в файле, что и соответствующий родительский.
  • У порожденного процесса обнуляются счетчики времени, потраченного системой для его обслуживания.
  • Системный вызов fork завершается неудачей и новый процесс не порождается, если:

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



  • Общее количество системной памяти, предоставленной для физического ввода-вывода, временно оказалось недостаточным.


  • При успешном завершении порожденному процессу возвращается значение 0, а родительскому процессу возвращается идентификатор порожденного процесса. В случае ошибки родительскому процессу возвращается -1, новый процесс не создается и переменной errno присваивается код ошибки.

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

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

    Если системный вызов exec закончился успешно, то он не может вернуть управление, так как вызвавший процесс уже заменен новым процессом. Возврат из системного вызова exec свидетельствует об ошибке. В таком случае результат равен -1, а переменной errno присваивается код ошибки.

    Новый процесс наследует у процесса, вызвавшего exec, следующие основные характеристики:

  • Значение поправки приоритета.


  • Идентификатор процесса.


  • Идентификатор родительского процесса.


  • Идентификатор группы процессов.


  • Терминальную линию.


  • Текущий каталог.


  • Корневой каталог.


  • Маску создания файлов.


  • Ограничения ресурсов.


  • Счетчики времени, потраченного системой на обслуживание этого процесса.


  • Блокировки доступа к сегментам файлов.



  • Содержание раздела