Краткий анализ горутины Golang в режиме MPG

Сопрограммы реализуются путем вызова (или выполнения) функции или метода с использованием ключевого слова go (это также может быть анонимная функция).

 Язык Go поддерживает параллелизм на уровне языка. Горутина — это поток пользовательского режима, предоставляемый языком Go. Иногда мы также называем его сопрограммой.

Так называемую сопрограмму также можно в некоторой степени назвать облегченным потоком. Она создается и управляется не ОС, а приложением, поэтому накладные расходы на использование невелики (обычно 4 КБ).

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

Планировщик состоит из четырех важных частей: M, G, P и Sched. Первые три определены в runtime.h, а Sched — в proc.c.

  • M (рабочий поток) представляет собой системный поток OS Thread, которым управляет операционная система.

  • P (процессор) соединяет контекст планирования M и G. Он отвечает за соединение G и M, ожидающих выполнения . Число P можно установить с помощью GOMAXPROCS(), что на самом деле представляет собой реальный параллелизм , то есть сколько горутин может выполняться одновременно.

  • G (горутина) Сущность горутины, включая стек вызовов, важную информацию планирования, такую ​​как канал и т. д.

На самом деле существует три модели соответствия потоков между потоком ОС операционной системы и пользовательским потоком языка программирования, а именно: 1:1, 1:N и M:N.

  • N:1 Несколько (N) пользовательских потоков всегда выполняются в одном потоке ядра. Переключение контекста происходит быстро, но не может по-настоящему использовать несколько ядер.
  • 1:1 Пользовательский поток работает только в одном потоке ядра. В настоящее время можно использовать несколько ядер, но переключение контекста происходит очень медленно, а эффективность переключения очень низкая.
  • M:N      Несколько горутин выполняются в нескольких потоках ядра . Это может сочетать в себе преимущества двух предыдущих, но, несомненно, увеличивает сложность планирования.

M:N сочетает в себе преимущества двух методов (N:1, 1:1). Несколько горутин могут обрабатываться в нескольких потоках ОС. Он может быстро переключать контексты и использовать преимущества многоядерности, и Go выбрал именно этот метод реализации.

 

 

MPG — его модель планирования.


M можно понимать как основной поток, который является потоком физического уровня. Это относительно ресурсоемко.

p можно понимать как контекст на протяжении всего процесса выполнения. Под контекстной средой можно просто понимать ресурсы, необходимые во время выполнения, или состояние операционной системы в этот момент.

Во время работы основного потока запускается сопрограмма, и при запуске сопрограммы требуется контекстная среда. Контекст заключается в том, можно ли выделить ЦП. Требуемые ресурсы и текущий статус работы.

G — сопрограмма

Несколько мс действуют на один процессор, тогда это параллелизм. Он работает параллельно на нескольких процессорах. Вы можете видеть, что M может запускать несколько сопрограмм для формирования очереди.

Горутина на языке Go выполняется на многоядерном процессоре (количество ядер процессора задается через runtime.GOMAXPROCS(1)). Фактическое количество работающих ядер ЦП может не соответствовать фактическому количеству физических ЦП.

Каждая горутина будет выбираться и поддерживаться определенным P (определенным ЦП), а M (физический вычислительный ресурс) каждый раз выбирает действительный P, а затем выполняет горутину в P.

Каждый P помещает горутину, которую он поддерживает, в очередь G, которая включает в себя информацию о стеке горутины, информацию об исполняемых файлах и т. д.

Созданный здесь поток M1 может находиться на других процессорах, что немного похоже на параллелизм.

Сопрограммы могут выполняться между несколькими потоками операционной системы или внутри потоков , что позволяет обрабатывать большое количество задач с небольшим объемом памяти. Благодаря временным интервалам сопрограмм в потоках операционной системы вы можете иметь как можно больше сопрограмм, предоставляющих услуги, используя небольшое количество потоков операционной системы, а среда выполнения Go может разумно определять, какие сопрограммы заблокированы, и временно откладывать их, а также обрабатывать другие сопрограммы.

 

 

Подведем итог:


M представляет собой нисходящее выполнение основного потока, а контекст p может запустить сопрограмму для работы в соответствии с условиями системы. Их может быть много, и все они могут находиться на одном процессоре, или каждый M может быть на другом процессоре.Это называется параллелизмом.

Когда сопрограмма заблокирована, у нее есть механизм переключения вперед и назад. Он может гарантировать выполнение основного потока, а также дать возможность выполнить поставленную в очередь G-сопрограмму.

рекомендация

отblog.csdn.net/qq_34556414/article/details/132885357