Middle
31
0
questionbank

Расскажи о планировании goroutine в Go.

Answer from sobes.tech neural network

Планировщик Go использует многопоточную модель M:N, где M goroutine отображаются на N потоков ОС. Работа планировщика основана на модели GMP (Goroutine, Machine, P).

  • G (Goroutine): Легковесный поток выполнения. Создаётся по ключевому слову go.
  • M (Machine): Поток ОС. Выполняет код goroutine. Горячий поток, блокирующие системные вызовы выполняются на отдельном M.
  • P (Processor): Локальная очередь goroutine, к которой привязан M. Количество P по умолчанию равно числу логических ядер CPU и контролируется переменной GOMAXPROCS.

Принцип работы:

  1. Когда нужно запустить goroutine, она помещается в локальную очередь P.
  2. M, привязанный к P, берёт goroutine из очереди и начинает её выполнение.
  3. Если локальная очередь P пуста, M может "украсть" goroutine из очереди другого P.
  4. Если goroutine блокируется (например, при системном вызове), текущий M отвязывается от P, а P привязывается к другому доступному M или создается новый M. Блокированная goroutine остаётся на заблокированном M до завершения блокирующей операции.
  5. Когда блокирующая операция завершается, goroutine возвращается в очередь другого P или текущего P, если он свободен.
  6. Планировщик периодически (каждые 10 мс) проверяет goroutine на выполнение более 10 мс для принудительного переключения (preemption).

Преимущества такого подхода:

  • Низкие

Планировщик Go использует многопоточную модель M:N, где M goroutine отображаются на N потоков ОС. Работа планировщика основана на модели GMP (Goroutine, Machine, P).

  • G (Goroutine): Легковесный поток выполнения. Создаётся по ключевому слову go.
  • M (Machine): Поток ОС. Выполняет код goroutine. Горячий поток, блокирующие системные вызовы выполняются на отдельном M.
  • P (Processor): Локальная очередь goroutine, к которой привязан M. Количество P по умолчанию равно числу логических ядер CPU и контролируется переменной GOMAXPROCS.

Принцип работы:

  1. Когда нужно запустить goroutine, она помещается в локальную очередь P.
  2. M, привязанный к P, берёт goroutine из очереди и начинает её выполнение.
  3. Если локальная очередь P пуста, M может "украсть" goroutine из очереди другого P.
  4. Если goroutine блокируется (например, при системном вызове), текущий M отвязывается от P, а P привязывается к другому доступному M или создается новый M. Блокированная goroutine остаётся на заблокированном M до завершения блокирующей операции.
  5. Когда блокирующая операция завершается, goroutine возвращается в очередь другого P или текущего P, если он свободен.
  6. Планировщик периодически (каждые 10 мс) проверяет goroutine на выполнение более 10 мс для принудительного переключения (preemption).

Преимущества такого подхода:

  • Низкие

Register or sign in to get access to full answers for all questions from the question bank.

gogoroutine-schedulingconcurrencyparallelismм:n-schedulingcontext-switching