(продолжение предыдущего поста)
Программа проходит путь от исходного кода до исполняемого файла, загружается в память, взаимодействует с ОС через системные вызовы, использует ресурсы компьютера (CPU, память, устройства) и завершается с очисткой всех задействованных ресурсов. Рассмотрим пошагово.
1. Компиляция и загрузка программы (Program Compilation and Loading)
- Исходный код (например,
Enter.c) передаётся компилятору.- Компилятор преобразует исходный код в объектный файл (
Enter.obj), проверяя синтаксис и семантику.- Используются библиотеки (например,
cw32.lib), из которых извлекаются необходимые функции (например, sprintf()).- Происходит статическая компоновка — связывание объектного файла с библиотеками для создания промежуточного кода.
- Далее подключается динамическая компоновка — связывание с динамическими библиотеками (
user32.dll и др.), используемыми для функций вроде MessageBox().- В итоге формируется исполняемый файл (
Enter.exe), готовый к запуску.2. Взаимодействие пользователя и распределение памяти (User Interaction and Memory Allocation)
- Пользователь запускает программу через графический интерфейс (например, клик по иконке).
- Операционная система (ОС) получает запрос и инициирует загрузку исполняемого файла.
- ОС выделяет память для программы, используя структуру памяти:
- Memory pool (пул памяти) — общее пространство для распределения.
- Stack (стек) — для хранения локальных переменных и вызовов функций.
- Heap (куча) — для динамического выделения памяти (
malloc, free).- Сегменты: BSS (неинициализированные данные), Data (инициализированные данные), Code (исполняемый код).
- Программа загружается в выделенную область памяти.
3. Системные вызовы (System Calls)
- Программа взаимодействует с ОС через системные вызовы (
system call), которые обеспечивают доступ к ресурсам (файлам, сети, устройствам).- Процесс вызова:
1. Программа делает системный вызов (например, открытие файла).
2. Управление передаётся ядру ОС (
kernel model), которое проверяет права доступа и параметры вызова.3. Ядро выполняет операцию через сервисные программы (например, чтение данных с диска).
4. Результат возвращается программе, которая продолжает выполнение.
- Таблица системных вызовов (
Sys_call_table) хранит адреса функций ядра.4. Состояние ЦП и структура памяти (CPU Status and Memory Structure)
- Программа выполняется на центральном процессоре (CPU), который работает в двух режимах:
- Пользовательский режим (user model) — выполнение прикладного кода.
- Режим ядра (kernel model) — выполнение системных вызовов и привилегированных операций.
- Кэширование: CPU использует кэши (L1, L2, L3) для ускорения доступа к данным.
- RAM хранит исполняемый код и данные программы во время работы.
- Регистры программ (
Program register) сохраняют состояние выполнения (адрес следующей инструкции).5. Архитектура фон Неймана (Von Neumann Architecture)
- Программа и данные хранятся в единой памяти (принцип фон Неймана).
- Центральный процессор (CPU) состоит из:
- Control Unit (CU) — управляет выполнением инструкций.
- Arithmetic/Logic Unit (ALU) — выполняет арифметические и логические операции.
- Данные поступают с устройств ввода (Input Device), обрабатываются процессором и выводятся на устройства вывода (Output Device).
- Memory Unit хранит промежуточные результаты и инструкции.
6. Завершение программы и освобождение ресурсов (Program Termination and Resource Recovery)
- Программа завершается по команде
exit() или по инициативе пользователя.- ОС выполняет очистку ресурсов:
- Освобождение файловых ресурсов (закрытие дескрипторов файлов).
- Освобождение сетевых ресурсов (разрыв соединений).
- Возврат памяти (освобождение стека, кучи, сегментов).
- Все ресурсы возвращаются в пул ОС, программа завершается, и её состояние удаляется из памяти.