## Что происходит в 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()` управление возвращается диспетчеру задач, который завершает процесс и освобождает все его ресурсы.