Как работает GOMAXPROCS и параллельность в Golang?

Когда мы создаем горутины я так понимаю создаются условно такие "потоки приложения" которые на самом деле внутри одного потока ОС.

Как тогда достигается реальная параллельность когда у нас не асинхронно, а именно одновременно выполняется код на разных ядрах?

Я так понимаю мы же не можешь из приложения перенаправить код на другие ядра, это должна сделать ОС ?

Нашел такое объяснение

Планировщик среды выполнения Go использует параметр GOMAXPROCS, чтобы определить, сколько
потоков ОС необходимо использовать для одновременного выполнения кода Go. Значение по
умолчанию - это количество ядер ЦП на машине. Например, на 8-ядерной машине планировщик
отправляет код Go 8 потокам ОС одновременно (GOMAXPROCS - n в планировании m: n).

Т.е. получается в момент старта программы мы просим у ОС сразу запустить 8 потоков, а в процессе выполнения программы распределяем задачи между ними?

И это будут не потоки "внутри приложения", а все таки реально разные потоки ОС ?


Ответы (1 шт):

Автор решения: hedgehogues

Да, вы правильно понимаете процесс работы горутин в Go. Горутины являются условными "потоками" приложения, которые могут быть исполнены одновременно с другими горутинами внутри одного потока ОС. Однако Go предоставляет механизмы, которые позволяют распределять горутины на разные ядра ЦП для одновременного исполнения.

Параметр GOMAXPROCS указывает, сколько потоков ОС необходимо использовать для одновременного исполнения кода Go. По умолчанию это значение равно количеству ядер ЦП на компьютере. Например, на 8-ядерной машине GOMAXPROCS будет равно 8, что означает, что планировщик Go будет использовать 8 потоков ОС для одновременного исполнения кода Go.

Когда вы запускаете горутину, планировщик Go распределяет ее на один из потоков ОС, который указан в GOMAXPROCS. Если все потоки ОС уже заняты, то горутина будет ожидать, пока один из потоков ОС освободится. Таким образом, использование горутин позволяет распараллелить код на разных ядрах ЦП, что повышает производительность приложения.

Однако следует иметь в виду, что использование горутин не гарантирует, что ваш код будет выполняться одновременно на разных ядрах ЦП. Это зависит от реализации ОС, которая может использовать различные механизмы для распределения потоков ОС на разные ядра ЦП.

→ Ссылка