Ответ
Запуск программы на уровне операционной системы — это многоэтапный процесс, который превращает файл на диске в работающий процесс в памяти. В UNIX-подобных системах (Linux, macOS) он обычно включает системные вызовы fork() и execve().
Основные шаги:
-
Инициация. Пользователь запускает программу через командную строку (например,
./my_app) или графический интерфейс. Оболочка (shell) или файловый менеджер находит исполняемый файл в файловой системе (используя, например, переменнуюPATH). -
Создание нового процесса (
fork()). Оболочка вызывает системный вызовfork(). Ядро ОС создает новый дочерний процесс, который является почти точной копией родительского процесса (оболочки). У него своя память, но изначально она содержит то же, что и у родителя. -
Загрузка программы (
execve()). Сразу послеfork()дочерний процесс вызывает системный вызовexecve()(или его вариацию). Этот вызов полностью заменяет текущее адресное пространство процесса кодом и данными из указанного исполняемого файла.- Загрузчик ОС читает заголовок файла (например, в формате ELF на Linux) для определения структуры программы.
- Он отображает сегменты файла (код, данные, bss) в виртуальную память нового процесса.
- Динамически связывает необходимые разделяемые библиотеки (например,
libc.so).
-
Передача управления. Ядро передает управление новому процессу, устанавливая счетчик команд (instruction pointer) на его точку входа (
_start). Эта точка входа выполняет инициализацию и затем вызывает главную функцию программы (например,main()в C/C++).
Контекст для интерпретируемых языков (Python, Node.js):
Когда вы запускаете команду python script.py, происходит тот же процесс, но исполняемым файлом является сам интерпретатор (/usr/bin/python).
- ОС запускает процесс
python. - Интерпретатор
pythonполучаетscript.pyкак аргумент командной строки. - Уже внутри своего процесса интерпретатор открывает, читает, компилирует
script.pyв байт-код и выполняет его в своей виртуальной машине (PVM).
Таким образом, с точки зрения ОС, запускается не ваш скрипт, а программа-интерпретатор, которая уже сама выполняет ваш код.