Чем занят центральный процессор, когда он ничем не занят?
Конечной целью работы современых процессоров являются освобождение от своих задач и скорейший переход в режим с минимальным энергопотреблением. На самом деле простаивающий процессор не простаивает, а занят процессами простаивания, ведь его нужно будет «разбудить» при возникновении какой-либо задачи.
Для человека это звучит взаимоисключающе, но для понимания этих терминов стоит помнить, что центральный процессор всегда что-то делает, даже в тот момент, когда он на самом деле не делает ничего.
В Windows этот процесс выглядит как System Idle Process или «Бездействие системы». Процесс бездействия имеет один или несколько потоков, и основной целью его существования является устранение необходимости в специальных условиях в планировщике задач. Если бы его не было, то могла бы возникнуть ситуация, когда нет ни одного доступного для запуска потока, но благодаря постоянной готовности одного или нескольких потоков задачи простаивания, этого не происходит.
В представленном примере цикла простаивания путём использования системного таймера прерывание таймера запрограммировано ядром на каждые четыре миллисекунды, и это называется периодом тика. Здесь мы имеем тик в 4 миллисекунды или 250 тиков в секунду — популярное значение в операционных системах Linux (конечно, его можно поменять при компиляции ядра путём изменения CONFIG_HZ). Другим известным является значение в 100 тиков в секунду. Высокий период времени между тиками, то есть уменьшение их частоты, сулит более высокую энергоэффективность.
В архитектуре x86 используется команда останова HLT. Её возраст уже достаточно велик, её ввели в первых процессорах 8086, также она была в 8080. То было время, когда количество транзисторов в чипах измерялось десятками тысяч. Но в ранних операционных системах поддержки этой команды не было, и пользователи ПК той эпохи могут помнить утилиты Rain, Waterfall, и CPUIdle, которые увеличивали объём времени, которое микропроцессор проводил в простое, что уменьшало энергопотребление и тепловыделение.
В семействе операционных систем Windows NT процесс простаивания используется для энергосбережения. Конкретная схема режима пониженного потребления отличается в разных операционных системах и процессорах. К примеру, x86-процессор под управлением Windows 2000 будет циклически запускать инструкцию HLT до тех пор, пока не получит сигнала завершения. Это приводит к отключению многих внутренних компонентов микропроцессора. В более поздних версиях Windows эта схема выглядит посложней, используется слой аппаратных абстракций для снижения тактовой частоты процессора или введения других механизмов энергосбережения.
У процесса бездействия всегда наименьший приоритет, и планировщик ОС никогда не выберет его для исполнения, если существует ещё один поток, готовый к запуску. У простаивания есть и другие особенности в обработке его приоритетов исполнения, к примеру, команда HLT может быть запущена только ядром.
Если открыть Диспетчер задач, то часто можно увидеть, как сильно процесс бездействия «загружает» компьютер, но в отличие от других процессов, его показатель иллюстрирует, сколько ресурсов или процессорного времени свободны при текущей работе компьютера. (Конечно, следить за простаиванием может быть удобней в Performance Monitor, запускаемом по своему имени perfmon.) В некоторых операционных системах процесс простаивания встроен в планировщик.
AMD и Intel из года в год улучшают производительность своих продуктов. Хотя чаще всего мы обращаем внимание только на повышение производительности, битва за энергопотребление тоже имеет место быть: от модели к модели улучшаются техники клок гейтинга, динамического регулирования частоты вычислительных ядер в зависимости от нагрузки, отключения питания неиспользуемых блоков и регулировки уровня напряжения питания элементов системы.
По материалам Extreme Tech, личного блога Густава Дуарте и Wikipedia.org (1, 2, 3).