## Что происходит в Windows при запуске программы
При запуске программы в Windows происходит сложный многоэтапный процесс, включающий в себя множество системных вызовов и взаимодействий. Давайте разберемся в деталях этого процесса.
### Этап 1: Пользовательский интерфейс
* Пользователь запускает программу, щелкнув по значку или ярлыку на рабочем столе, в меню «Пуск» или в проводнике Windows.
* Операционная система регистрирует этот запрос и передает его системному компоненту, известному как диспетчер задач.
### Этап 2: Диспетчер задач
* Диспетчер задач отвечает за создание нового процесса для запуска программы.
* Он выделяет необходимую память и другие ресурсы для процесса.
* Диспетчер задач загружает исполняемый файл программы в память.
### Этап 3: Загрузка исполняемого файла
* Исполняемый файл — это файл, содержащий машинный код, который будет выполнять программа.
* Windows помещает исполняемый файл в виртуальную память процесса.
* Виртуальная память — это абстрактная область памяти, которая отображается в физической памяти, доступной компьютеру.
### Этап 4: Выполнение кода
* Система передает управление процессу программы.
* Процессор начинает выполнять машинный код, загруженный из исполняемого файла.
* Программа загружает в память необходимые модули и библиотеки.
### Этап 5: Инициализация программы
* Программа выполняет свою функцию `main()`, которая является точкой входа для большинства программ.
* Функция `main()` выполняет необходимую инициализацию, например, создает объекты и устанавливает параметры.
### Этап 6: Создание графического интерфейса (для программ с графическим интерфейсом)
* Если программа предназначена для работы в среде графического интерфейса, она создает окна, кнопки и другие элементы графического интерфейса.
* Эти элементы отображаются в отдельном процессе, известном как процесс оболочки.
### Этап 7: Обработка событий
* Программа входит в цикл обработки событий.
* В этом цикле она ожидает ввода пользователя, например, щелчков мышью или нажатий клавиш.
* Когда событие происходит, программа обрабатывает его соответствующим образом.
### Этап 8: Завершение программы
* Когда программа завершает свою работу, она вызывает функцию `exit()`.
* Функция `exit()` освобождает все ресурсы, занятые программой, включая память и открытые файлы.
* Процесс программы завершается, и управление возвращается диспетчеру задач.
### Подробные сведения о каждом этапе
**1. Пользовательский интерфейс**
* Когда пользователь щелкает по значку программы, Windows отправляет сообщение приложению проводника Windows.
* Приложение проводника Windows преобразует сообщение в запрос на создание процесса и передает его диспетчеру задач.
**2. Диспетчер задач**
* Диспетчер задач создает новый процесс и назначает ему уникальный идентификатор (PID).
* Он выделяет виртуальную память для исполняемого файла программы, стека и динамической памяти.
* Он загружает исполняемый файл в виртуальную память процесса.
**3. Загрузка исполняемого файла**
* Исполняемый файл представляет собой двоичный файл в формате PE (Portable Executable).
* Загрузка исполняемого файла включает в себя чтение заголовка PE, секций и других метаданных.
* Windows отображает секции исполняемого файла в виртуальную память процесса.
**4. Выполнение кода**
* Процессор начинает выполнять инструкции машинного кода, загруженные из исполняемого файла.
* Он использует программный счетчик (PC) для отслеживания выполняемой инструкции.
* Инструкции машинного кода загружаются из виртуальной памяти в кэш процессора.
**5. Инициализация программы**
* Функция `main()` выполняет необходимую инициализацию, которая обычно включает в себя следующие действия:
* Объявление переменных и выделение памяти
* Создание объектов и выполнение конструкторов
* Загрузка и вызов других модулей
* Настройка параметров и флагов
**6. Создание графического интерфейса**
* Для программ с графическим интерфейсом функция `main()` обычно создает главное окно приложения.
* Главное окно представляет собой корневой элемент иерархии окон.
* Окна создаются с помощью API Windows, таких как `CreateWindow()` и `ShowWindow()`.
**7. Обработка событий**
* Цикл обработки событий — это бесконечный цикл, который ожидает событий, таких как сообщения о вводе с клавиатуры и мыши.
* Для обработки событий Windows использует очередь сообщений.
* Каждому процессу назначается своя очередь сообщений.
**8. Завершение программы**
* Когда программа завершает свою работу, она вызывает функцию `exit()`.
* Функция `exit()` выполняет следующие действия:
* Вызывает деструкторы всех объектов
* Освобождает всю динамически выделенную память
* Закрывает все открытые файлы
* Отправляет сообщение диспетчеру задач, чтобы завершить процесс
После выполнения функции `exit()` управление возвращается диспетчеру задач, который завершает процесс и освобождает все его ресурсы.