Форк
Материал из Википедии — свободной энциклопедии
Форк (англ. fork — вилка) — процесс расщепления программного проекта на две независимые ветки. При этом каждая из веток развивается независимо от другой, разными авторами. В одной ветке могут быть реализованы возможности, отсутствующие в другой, в таком случае обе ветки могут потерять совместимость между собой.
[править] Unix-системы
В Unix-системах, fork()
— системный вызов, создающий новый (дочерний) процесс, идентичный выполняющему этот вызов. После вызова fork()
алгоритм обычно разветвляется (родительский процесс получает от fork()
PID дочернего, а дочерний получает нуль).
После fork()
дочерний процесс чаще всего выполняет системный вызов exec()
, загружающий в пространство процесса новую программу (именно так, и только так, в Unix-системе выполняется запуск программы в отдельном процессе). Так, первый (нулевой) процесс Unix (ядро системы) создает свою копию, чтобы запустить init (процесс с PID = 1), который в свою очередь создает дочерние процессы для запуска инициализации системы и терминалов.
Некоторые программы создают дочерние процессы не для запуска другой программы, а для выполнения параллельной задачи. Так, например, поступают простые сетевые серверы — при подсоединении клиента, сервер создает свою копию (дочерний процесс), которая обслуживает клиентское соединение и завершается по его закрытию. Родительский же процесс продолжает ожидать новых соединений.
Вызов fork()
выполняется довольно долго, так как требует копирования большого количества данных. Для того чтобы это обойти, некоторые сетевые серверы (например, веб-серверы Apache и Lighttpd), создают дочерние процессы заранее, чтобы уменьшить время отклика сервера. Также существуют «облегченные» реализации fork()
, отображающие в новый процесс страницы памяти родительского, вместо того чтобы их копировать (новая страница создается только при изменении ее содержимого одним из процессов), что существенно снижает время создания нового процесса.