Как операционная система запускает исполняемый файл?

«Как операционная система запускает исполняемый файл?» — вопрос из категории Операционные системы, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Запуск программы на уровне операционной системы — это многоэтапный процесс, который превращает файл на диске в работающий процесс в памяти. В UNIX-подобных системах (Linux, macOS) он обычно включает системные вызовы fork() и execve().

Основные шаги:

  1. Инициация. Пользователь запускает программу через командную строку (например, ./my_app) или графический интерфейс. Оболочка (shell) или файловый менеджер находит исполняемый файл в файловой системе (используя, например, переменную PATH).

  2. Создание нового процесса (fork()). Оболочка вызывает системный вызов fork(). Ядро ОС создает новый дочерний процесс, который является почти точной копией родительского процесса (оболочки). У него своя память, но изначально она содержит то же, что и у родителя.

  3. Загрузка программы (execve()). Сразу после fork() дочерний процесс вызывает системный вызов execve() (или его вариацию). Этот вызов полностью заменяет текущее адресное пространство процесса кодом и данными из указанного исполняемого файла.

    • Загрузчик ОС читает заголовок файла (например, в формате ELF на Linux) для определения структуры программы.
    • Он отображает сегменты файла (код, данные, bss) в виртуальную память нового процесса.
    • Динамически связывает необходимые разделяемые библиотеки (например, libc.so).
  4. Передача управления. Ядро передает управление новому процессу, устанавливая счетчик команд (instruction pointer) на его точку входа (_start). Эта точка входа выполняет инициализацию и затем вызывает главную функцию программы (например, main() в C/C++).

Контекст для интерпретируемых языков (Python, Node.js):

Когда вы запускаете команду python script.py, происходит тот же процесс, но исполняемым файлом является сам интерпретатор (/usr/bin/python).

  • ОС запускает процесс python.
  • Интерпретатор python получает script.py как аргумент командной строки.
  • Уже внутри своего процесса интерпретатор открывает, читает, компилирует script.py в байт-код и выполняет его в своей виртуальной машине (PVM).

Таким образом, с точки зрения ОС, запускается не ваш скрипт, а программа-интерпретатор, которая уже сама выполняет ваш код.