Что происходит с процессором, когда в операционной системе нет готовых к выполнению задач?

Ответ

Когда у процессора (CPU) нет задач для выполнения, операционная система переводит его в состояние простоя (idle state) для снижения энергопотребления и тепловыделения.

Это достигается с помощью специальной инструкции, такой как HLT (halt) на архитектуре x86. В этом состоянии процессор прекращает выполнение инструкций до получения следующего прерывания (например, от таймера или устройства ввода-вывода).

Современные процессоры поддерживают более глубокие состояния сна (C-states, от C1 до C-states), которые обеспечивают еще большую экономию энергии, отключая различные компоненты процессора. Чем глубже состояние сна, тем больше времени требуется для "пробуждения".

Какое отношение это имеет к Go?

Go runtime управляет горутинами, распределяя их по потокам ОС. Если в Go-приложении нет готовых к выполнению горутин, планировщик Go может перевести соответствующий поток операционной системы в состояние ожидания. Это, в свою очередь, позволяет ОС перевести физический CPU в состояние простоя, если других задач в системе также нет.

Ответ 18+ 🔞

Да ты посмотри, какая хитрая штука получается! Вот сидит твой процессор, здоровый такой кремень, и вдруг — нихуя не делает. Ну а че ему, дураку, вхолостую крутиться, энергию жечь и греться, как утюг? Правильно, ни к чему.

Операционка, видя такое дело, берет и отправляет его в состояние простоя (idle state). По сути, говорит ему: «Слушай, дружок, приляг, отдохни». А как она это делает? Да через специальную команду, типа HLT на этих ваших x86. Процессор её выполняет и замирает, как впадло, пока его не пнут каким-нибудь прерыванием — от таймера или там мышки.

Ну а современные-то чипы — те вообще мастера по сну! У них целая иерархия этих спячек, C-states называются. C1 — это просто задремал, а вот C6 — это уже «разбудить только апокалипсисом». Чем глубже уснул, тем дольше потом глаза протираешь, но зато и энергии экономишь — овердохуища!

А при чём тут Go, спросишь ты?

А при том, что Go runtime — он ж не лыком шит. Управляет он своими горутинами, раскидывает их по потокам ОС. И если вдруг наступает момент, когда все горутины либо спят, либо ждут — делать-то нехуй! — планировщик Go такой: «Так, братва, тишина в салуне». И отпускает поток ОС в свободное плавание, то есть в ожидание.

А операционка, получив такой подарок, смотрит: ага, поток уснул, других дел на этом ядре тоже нет... И тут же — хуяк! — отправляет физическое ядро процессора в ту самую сладкую дрёму. Экономия, эффективность, все дела. Вот такая, блядь, матрешка получается: горутины -> поток ОС -> ядро CPU. Все друг другу помогают не тратить силы попусту. Умно, ёпта!