Найти в Дзене

#24 Планировщик горутин

Чтобы понять, как работает планировщик горутин, рассмотрим наглядный пример. Есть ресторан, в котором работают повара и у них множество заказов, которые необходимо приготовить. Повара в данном случае - это логические процессоры, а заказы это горутины, которые нужно обработать. Каждый повар работает только над одним заказом за раз. Аналогично этому логический процессор выполняет одну горутину. Если заказ требует длительного ожидания (например, нужно сварить 40 хинкалей), повар может начать работать над другим заказом. Также как планировщик Go создает новый поток ОС для другой горутины, если текущая заблокирована системным вызовом. Планировщик Go эффективно распределяет 'заказы' между 'поварами', оптимизируя использование доступных ресурсов и минимизируя время ожидания. Детальное объяснение Логический процессор: связующее звено между потоками ОС и очередью горутин. Планировщик извлекает горутину из очереди и запускает ее в потоке ОС, используя контекст логического процессора. Поток ОС:

Чтобы понять, как работает планировщик горутин, рассмотрим наглядный пример. Есть ресторан, в котором работают повара и у них множество заказов, которые необходимо приготовить. Повара в данном случае - это логические процессоры, а заказы это горутины, которые нужно обработать.

Каждый повар работает только над одним заказом за раз. Аналогично этому логический процессор выполняет одну горутину. Если заказ требует длительного ожидания (например, нужно сварить 40 хинкалей), повар может начать работать над другим заказом. Также как планировщик Go создает новый поток ОС для другой горутины, если текущая заблокирована системным вызовом.

Планировщик Go эффективно распределяет 'заказы' между 'поварами', оптимизируя использование доступных ресурсов и минимизируя время ожидания.

Детальное объяснение

Логический процессор: связующее звено между потоками ОС и очередью горутин. Планировщик извлекает горутину из очереди и запускает ее в потоке ОС, используя контекст логического процессора.

Поток ОС: если горутина осуществляет системный вызов, который блокирует поток (например, в ожидании I/O операции), планировщик создает дополнительный поток для обработки остальных горутин до момента разблокировки основного.

Горутина: это легковесный поток выполнения в Go.

Количество логических процессоров определяется значением GOMAXPROCS, которое в идеале равно количеству ядер процессора. Например, на двухядерном процессоре планировщик будет использовать два потока ОС.

Для управления планировщиком в Go предусмотрены следующие функции из пакета runtime:

GOMAXPROCS(n int) int: изменяет количество логических процессоров, используемых для выполнения горутин.

Gosched(): освобождает процессор для других горутин, временно приостанавливая текущую.

LockOSThread(): привязывает горутину к текущему потоку ОС. Это необходимо при взаимодействии с кодом на C, требующим стабильности потока.

NumCPU() int: возвращает количество доступных ядер процессора.

NumGoroutine() int: показывает, сколько горутин активно в данный момент

Пример использования на компьютере с десятью ядрами:

-2