fork

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

В Unix-системах, fork() — системный вызов, создающий новый процесс(-потомок), который является почти точной копией процесса(-родителя), выполняющего этот вызов. Между процессом-потомком и процессом-родителем существуют различия:

  • PID процесса-потомка отличен от PID процесса-родителя;
  • значению PPID процесса-потомка присваивается значение PID процесса-родителя;
  • Процесс-потомок получает собственную таблицу файловых дескрипторов, то есть файлы, открытые процессом-родителем, не являются таковыми для процесса-потомка;
  • для процесса-потомка очищаются вcе ожидающие доставки сигналы (UNIX);
  • временная статистика выполнения процесса-потомка в таблицах ОС обнуляется;
  • блокировки памяти и записи, установленные в процессе-родителе, не наследуются.

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

После fork() процесс-потомок чаще всего выполняет системный вызов exec(), загружающий в пространство процесса новую программу (именно так, и только так, в Unix-системе выполняется запуск программы в отдельном процессе). Так, первый (нулевой) процесс Unix (ядро системы) создаёт свою копию, чтобы запустить init (процесс с PID = 1), который в свою очередь создаёт дочерние процессы для запуска инициализации системы и терминалов.

Некоторые программы создают дочерние процессы не для запуска другой программы, а для выполнения параллельной задачи. Так, например, поступают простые сетевые серверы — при подсоединении клиента, сервер создаёт свою копию (дочерний процесс), которая обслуживает клиентское соединение и завершается по его закрытию. Родительский же процесс продолжает ожидать новых соединений.

Вызов fork() выполняется довольно долго, так как требует копирования большого количества данных. Для того чтобы это обойти, некоторые сетевые серверы (например, веб-серверы Apache и Lighttpd), создают дочерние процессы заранее, чтобы уменьшить время отклика сервера. Также существуют «облегченные» реализации fork(), отображающие в новый процесс страницы памяти родительского, вместо того чтобы их копировать (новая страница создаётся только при изменении её содержимого одним из процессов), что существенно снижает время создания нового процесса (т. н. copy-on-write).

Ссылки

ca:Fork (Unix) cs:Fork (systémové volání) de:Fork (Unix) en:Fork (operating system) es:Bifurcación (sistema operativo) eu:Fork (sistema eragileak) fr:Fork#Fonction fork dans UNIX ja:Fork ko:포크 (운영 체제) sv:Fork (systemanrop)

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....