Процессы создаются посредством системного вызова fork. За fork вскоре обычно следует системный вызов exec, который накладывает на виртуальное адресное пространство порожденного процесса содержимое исполняемого образа, который находится в файловой системе. Затем процесс выполняется до тех пор, пока не завершится, либо добровольно, либо принудительно путем получения сигнала.
Системный вызов fork дублирует адресное пространство существующего процесса, создавая идентичный порожденный процесс. Набор системных вызовов fork является единственным способом создания новых процессов в FreeBSD. fork дублирует все ресурсы оригинального процесса и копирует адресное пространство этого процесса.
Ресурсы виртуальной памяти процесса, которые должны быть выделены для потомка, включают структуру процесса и связанные с ней подструктуры, а также структуру пользователя и стек ядра. Кроме того, ядро должно забронировать хранилище (либо память, либо пространство файловой системы, либо пространство подкачки), использующееся для резервирования процесса. Общий набросок реализации fork следующий.
- Резервирование адресного пространства для порожденного процесса. Выделение структуры потока и элемента процесса и ее заполнение. Копирование в порожденный процесс группы процесса родителя, мандатов (credentials), дескрипторов файлов, квот (limits) и действий сигналов. Выделение новой структуры пользователя и стека ядра, копирование в них содержимого из текущего процесса для их инициализации. Выделение структуры vmspace. Дублирование адресного пространства путем создания копий структур vm_map_entry родителя, помеченных для копирования при записи. Организация возвращения порожденным процессом 0, чтобы отличить его возвращаемое значение от нового PID, который возвращается в процесс родителя. Выделение и инициализация структуры процесса и организация возвращаемого значения. В оставшейся части данного раздела обсуждаются другие шаги, вовлеченные в дублирование процесса.
- 26/10/2010 13:51 - Исполнение файла
- 26/10/2010 11:57 - Дизайн аппаратного кеша
- 26/10/2010 07:21 - Дублирование адресного пространства пользователя
- 26/10/2010 06:04 - Зональный распределитель ядра
- 25/10/2010 19:26 - Резервирование ресурсов ядра
- 24/10/2010 07:08 - Malloc ядра
- 24/10/2010 06:47 - Индивидуальные моментальные снимки
- 23/10/2010 02:20 - Страничная подкачка
- 22/10/2010 23:00 - Пейджер подкачки
- 22/10/2010 12:25 - Сворачивание теневых цепочек