Этот урок посвящен фундаментальным концепциям запуска новых процессов в системе Linux. Понимание этого механизма дает представление о внутренней работе операционной системы.
Модель Fork и Exec
Основной механизм создания процессов в Linux включает в себя существующий процесс, клонирующий себя с помощью системного вызова fork. Вызов fork создает почти идентичный дочерний процесс. Этот новый дочерний процесс получает свой собственный уникальный идентификатор процесса (PID), в то время как исходный процесс становится его родителем, идентифицируемым по идентификатору родительского процесса (PPID).
После форка дочерний процесс может либо продолжить выполнение той же программы, что и его родитель, либо, что более распространено, использовать системный вызов execve для загрузки и запуска новой программы. Вызов execve фактически заменяет адресное пространство памяти процесса на адресное пространство новой программы, позволяя начать выполнение другой задачи. Эта двухэтапная модель «fork-exec» является краеугольным камнем того, как создать процесс в Linux.
Наблюдение за отношениями родитель-потомок
Мы можем наблюдать эти отношения родитель-потомок в действии с помощью команды ps:
ps l
Опция l предоставляет представление в «длинном формате», показывая больше подробностей о запущенных процессах. Вы увидите столбец с пометкой PPID, что означает Parent Process ID (Идентификатор родительского процесса). Посмотрите на процесс вашей текущей оболочки (например, bash). Когда вы запускаете команду ps l, вы заметите, что PID процесса вашей оболочки совпадает с PPID процесса ps l. Это потому, что ваша оболочка форкнула себя для создания процесса ps.
Процесс Init
Если каждый процесс является потомком другого, должен существовать изначальный предок. Это процесс init. При загрузке системы ядро создает init как самый первый процесс в пространстве пользователя, присваивая ему PID, равный 1. Процесс init является конечным родителем всех остальных процессов и работает с привилегиями root для управления системой. Его нельзя завершить до выключения системы, и он отвечает за запуск многих служб, которые поддерживают работу системы.