Открыть сервис

ПриЗавершенииРаботыСистемы

ПриЗавершенииРаботыСистемы — это системное событие, возникающее в операционной системе (ОС) семейства Windows при инициировании процедуры выключения, перезагрузки или завершения сеанса пользователя. Данное событие является частью жизненного цикла работы ОС и служит сигналом для запущенных приложений, служб и драйверов о необходимости корректного завершения своей деятельности, сохранения данных и освобождения ресурсов. В более широком смысле термин может использоваться для обозначения любого программного или аппаратного механизма, обеспечивающего безопасное прекращение работы вычислительной системы.

История возникновения

Концепция корректного завершения работы системы возникла с появлением многозадачных операционных систем. В ранних однозадачных средах (например, MS-DOS) выключение компьютера происходило простым отключением питания, что часто приводило к потере данных и повреждению файловых систем. С развитием графических интерфейсов и многозадачности, особенно в Windows 95, была внедрена процедура «Завершение работы», которая включала:

  • Уведомление всех активных процессов о предстоящем завершении.
  • Ожидание подтверждения от приложений на сохранение данных.
  • Закрытие файловых дескрипторов и сброс кэшей на диск.
  • Остановку драйверов и служб в определённом порядке.

В современных версиях Windows (начиная с Windows Vista и Windows 7) механизм усложнился за счёт введения гибридного режима выключения (Fast Startup), который сочетает полное завершение работы сеанса пользователя с сохранением состояния ядра ОС в файл гибернации для ускорения последующей загрузки.

Типы событий завершения работы

Событие «ПриЗавершенииРаботыСистемы» может быть инициировано различными способами:

Программное завершение

  • Команда пользователя: выбор пункта «Завершение работы», «Перезагрузка» или «Выход из системы» в меню «Пуск» или через комбинацию клавиш (например, Alt+F4 на рабочем столе).
  • Системные вызовы: программы могут вызывать функции Windows API, такие как ExitWindowsEx или InitiateShutdown, для программного запуска завершения работы.
  • Командная строка: утилита shutdown (например, shutdown /s /t 0 для немедленного выключения).
  • Планировщик заданий: автоматическое завершение работы по расписанию или при наступлении определённого события (например, низкий заряд батареи).

Аппаратное завершение

  • Кнопка питания: кратковременное нажатие на кнопку питания компьютера (если в настройках электропитания задано действие «Завершение работы»).
  • Таймеры и датчики: срабатывание датчика температуры, перегрузки по току или истечение таймера встроенного ПО (BIOS/UEFI).

Аварийное завершение

  • Сбой системы (BSOD): «синий экран смерти» (Blue Screen of Death) автоматически запускает процедуру аварийного завершения с созданием дампа памяти.
  • Потеря питания: внезапное отключение электроэнергии, которое не позволяет системе корректно завершить работу.

Механизм работы события

Когда система получает команду на завершение работы, ОС инициирует последовательность действий:

  1. Отправка сообщения WM_QUERYENDSESSION — всем окнам приложений. Система ожидает ответа (обычно в течение 5–20 секунд), позволяя приложениям запросить отсрочку или отменить завершение (например, если есть несохранённые данные).
  2. Отправка сообщения WM_ENDSESSION — после получения согласия от всех приложений (или по истечении тайм-аута) система отправляет это сообщение, сигнализируя о неизбежном завершении.
  3. Завершение службслужбы Windows получают уведомление SERVICE_CONTROL_PRESHUTDOWN (для критических служб) и SERVICE_CONTROL_SHUTDOWN. Службы должны корректно остановиться в течение заданного времени (обычно 20 секунд на этап).
  4. Сброс файлового кэша — все данные из оперативной памяти, ожидающие записи на диск, сбрасываются на накопитель.
  5. Завершение драйверов — драйверы устройств получают команду на остановку и освобождение ресурсов.
  6. Остановка ядра — после завершения всех пользовательских процессов и служб ядро ОС сохраняет своё состояние (в режиме гибернации или гибридного выключения) и передаёт управление загрузчику или отключает питание.

Обработка события в приложениях

Разработчики программного обеспечения могут обрабатывать событие «ПриЗавершенииРаботыСистемы» для выполнения критических операций:

В Windows Forms и WPF

  • Обработка события FormClosing или Application.ApplicationExit.
  • Переопределение метода WndProc для перехвата сообщений WM_QUERYENDSESSION и WM_ENDSESSION.

В консольных приложениях и службах

  • Использование обработчика Console.CancelKeyPress (для консольных приложений).
  • Реализация интерфейса ServiceBase с переопределением методов OnShutdown или OnStop.

В языках высокого уровня (C#, C++, Python)

  • C#: подписка на событие SystemEvents.SessionEnding из пространства имён Microsoft.Win32.
  • C++: использование функции SetConsoleCtrlHandler для обработки сигнала CTRL_SHUTDOWN_EVENT.
  • Python: библиотека win32api (pywin32) позволяет подписываться на события завершения сеанса.

Практические аспекты и проблемы

Потеря данных

Наиболее частая проблема при завершении работы — потеря несохранённых данных в приложениях, которые не обрабатывают событие должным образом. Например, текстовые редакторы, графические редакторы и среды разработки обычно запрашивают сохранение изменений.

Время ожидания

Система устанавливает жёсткие тайм-ауты для завершения процессов (обычно 5 секунд для приложений и 20 секунд для служб). Если приложение не отвечает в течение этого времени, ОС принудительно завершает его (с помощью вызова TerminateProcess), что может привести к повреждению данных.

Гибридное выключение (Fast Startup)

В Windows 8 и более новых версиях по умолчанию включён режим быстрого запуска. При выборе «Завершение работы» система не полностью завершает работу ядра — оно сохраняется в файл гибернации. Это может приводить к тому, что некоторые драйверы и службы не получают событие завершения работы в полном объёме, что иногда вызывает проблемы с оборудованием (например, с Wi-Fi адаптерами или звуковыми картами).

Влияние на сторонние программы

Антивирусные программы, брандмауэры и другое защитное ПО часто перехватывают событие завершения работы для выполнения собственных проверок, что может замедлять выключение компьютера.

Критика и альтернативы

Критика подхода Windows

  • Перегруженность тайм-аутами: жёсткие временные рамки не всегда достаточны для корректного завершения сложных приложений (например, баз данных или виртуальных машин).
  • Отсутствие уведомления пользователя: система не всегда информирует пользователя о том, какие приложения задерживают завершение работы (до Windows 10 эта информация была скрыта).
  • Неоднозначность гибридного режима: пользователи часто путают «Завершение работы» с «Перезагрузкой», так как гибридное выключение не очищает состояние ядра, что может приводить к накоплению ошибок.

Альтернативные подходы в других ОС

  • Linux: процедура завершения работы более гибкая — сигнал SIGTERM отправляется процессам, после чего через заданный интервал (по умолчанию 5–10 секунд) отправляется SIGKILL. Пользователь может настроить тайм-ауты через systemd или init-скрипты.
  • macOS: использует механизм launchd с возможностью отсрочки завершения для критических процессов (например, Time Machine).
  • Встраиваемые системы (RTOS): часто не имеют процедуры завершения — выключение происходит аппаратно, а данные сохраняются в энергонезависимую память в реальном времени.

Интересные факты

  • В Windows 95 и 98 при завершении работы можно было увидеть сообщение «Теперь можно безопасно выключить компьютер» — это наследие эпохи, когда управление питанием через ОС не было стандартом.
  • В Windows 10 и 11 существует скрытая команда shutdown /a, которая отменяет запланированное завершение работы (если не истёк тайм-аут).
  • Некоторые вредоносные программы (например, трояны-вымогатели) намеренно игнорируют событие завершения работы, чтобы не позволить пользователю выключить компьютер до завершения шифрования данных.

Источники

  1. Microsoft Docs — «WM_QUERYENDSESSION message» (Windows Desktop App Development).
  2. Microsoft Docs — «Service State Transitions» (Windows Service Development).
  3. Русскоязычная документация MSDN — «Завершение работы системы (Windows)».
  4. Книга «Windows Internals, Part 1» (7th edition) — Mark Russinovich, David Solomon, Alex Ionescu.
  5. Статья «Understanding Windows Shutdown» — журнал «Windows IT Pro» (2009).
  6. Документация по API ExitWindowsEx и InitiateShutdown — Microsoft Learn.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →