Урок 6: fork() — создание дочернего процесса
fork() — это системный вызов, который удваивает число процессов: он создаёт точную копию текущего процесса. Понимание fork() необходимо каждому системному инженеру — nvidia-docker и распределитель GPU в Slurm используют его для создания изолированных сред под каждую задачу GPU. Когда с процессами GP
fork() — это как отксерокопировать всё содержимое вашего мозга и поместить его в другое тело — вдруг появляются два человека, которые помнят всё до момента копирования. Единственное различие в том, что у одного другой ID-номер, чем у другого.
- fork()
- Системный вызов, создающий дочерний процесс, который является копией родительского процесса. fork() возвращает 0 дочернему процессу, PID дочернего процесса — родительскому, и -1 при неудаче.
- Copy-on-Write (COW)
- Оптимизация fork(): ядро не копирует физически всю память сразу. Страницы памяти разделяются с родителем, пока один из них не выполнит запись — тогда копируется только эта страница.
- Дочерний процесс (child process)
- Процесс, созданный fork(). Дочерний процесс получает новый PID, но его PPID — это PID родителя. У дочернего процесса есть независимая копия адресного пространства.
- getpid() / getppid()
- Системные вызовы, которые возвращают PID текущего процесса и PID его родителя соответственно. Полезны после fork() для различения родителя и потомка.
- Дублирование адресного пространства
- fork() создаёт для дочернего процесса независимое виртуальное адресное пространство с теми же адресами, что и у родителя. Изменение переменной в дочернем процессе не влияет на родителя и наоборот (благодаря Copy-on-Write).