Рубрики
Uncategorized

Предварительное обсуждение и простое расширение программы “Изучение языка Go” с 24 апреля 2019 года

Автор оригинала: David Wong.

виноград

Все видео: https://segmentfault.com/a/11…

Оригинальный видеообращение: https://biglive.xueersi.com/L…

Знание ассоциаций GO (расширений)

Самой большой особенностью языка Go является то, что он поддерживает параллелизм на уровне языка. Goroutine-это самая базовая исполнительная единица в Go. Фактически, в каждой программе Go есть по крайней мере одна гороутина: основная гороутина. Когда программа запустится, она будет создана автоматически.

Прежде всего, поймите, что такое сопрограмма и что такое поток.

СОТРУДНИЧЕСТВО: Также известное как микропоточность, подобно подпрограммам (или функциям), СОТРУДНИЧЕСТВО также является компонентом программы. По сравнению с подпрограммами, сопрограммы являются более общими и гибкими, но на практике они используются не так широко, как подпрограммы. Подобно потокам, стеки являются общими, стеки не являются общими, и переключение процессов обычно явно контролируется программистами в коде. Это позволяет избежать дополнительных затрат на переключение контекста, учитывает преимущества многопоточности и упрощает сложность высокопроизводительных параллельных программ. Goroutine можно понимать как совместный процесс языка Go. Он также может выполняться в одном или нескольких потоках.

Поток: Облегченный процесс (LWP) – это наименьшая единица потока выполнения программы. Стандартный поток состоит из идентификатора потока, указателя текущей инструкции (PC), набора регистров и стека. Кроме того, потоки-это объект в процессе и базовая единица, которая независимо запланирована и распределена системой. Потоки не владеют системными ресурсами и имеют лишь небольшую часть необходимых ресурсов в работе, но они могут совместно использовать все ресурсы, принадлежащие процессу, с другими потоками, принадлежащими тому же процессу. Потоки имеют свой собственный независимый стек и общую кучу, общую кучу, не совместно используют стек, и переключение потоков обычно планируется операционной системой.

Дифференциация: Совместная работа выполняется в потоке, отображает управление в коде, не имеет ресурсов, потребляемых переключением контекста, и имеет пространство стека для хранения собственного контекста. Если места в стеке недостаточно, будут изменены другие протоколы.

Go реализует две формы параллелизма. Первый широко признан: многопоточная общая память. На самом деле это многопоточная разработка на Java или C++. Еще одна уникальная для языка Go и рекомендуемая языком Go модель параллелизма CSP (передача последовательных процессов).

Модель параллелизма CSP: общая память посредством связи, традиционные многопоточные системы взаимодействуют с помощью общей памяти, язык GO разделяет память посредством связи, так сказать, эта модель CSP реализована через подпрограмму и канал.

- goroutine is the concurrent execution unit in Go language. A little abstract, in fact, is similar to the traditional concept of "thread", which can be understood as "thread".
- Channel is the communication mechanism before the goroutine in Go language. Popularly speaking, it is the "pipeline" of communication between various goroutines, which is somewhat similar to the pipeline in Linux.

Для создания goroutine требуется простой код go func () для создания. Канал также должен объявить чана. В то же время каналу необходимо уделять внимание при его использовании. Канал блокируется при чтении и записи. Запись или считывание данных в конвейер аналогично потоковому вводу и выводу.

Принцип реализации параллелизма GO

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

Наш компьютерный язык можно узко рассматривать как своего рода “программное обеспечение”. Так называемые “потоки” на этих языках часто являются потоками пользовательского режима, которые отличаются от потоков в состоянии ядра самой операционной системы (KSE). То есть, независимо от того, как вы реализуете параллелизм, на самом деле это в основном поток, который вызывает состояние ядра. Весь параллелизм-это бумажный тигр.~

Модель потоков может быть реализована следующими способами: 1. Модель потоков на уровне пользователя, 2. Модель потоков на уровне ядра, 3. Двухуровневая модель потоков. Наша модель потоков GO – это специальная двухуровневая модель потоков (модель планирования GPM).

Модель планирования GPM:

  • G: Представляет goroutine, хранит информацию о стеке, статус goroutine и функцию задачи goroutine для goroutine.
  • P: Представляет собой логический процессор. Число P определяет максимальное количество параллельных G в системе (предпосылка: количество физических ядер процессора системного числа P); наибольшая роль P заключается в различных очередях объектов G, связанных списках, некоторых кэшах и состояниях, которые у него есть.
  • M: M представляет реальные вычислительные ресурсы для выполнения. После привязки действительного p он входит в цикл схемы; и механизм цикла схемы состоит в том, чтобы получить G из различных очередей и локальных очередей p, переключиться на стек выполнения G и выполнить функции G, вызвать goexit для очистки и возврата к m, так что неоднократно. M не сохраняет состояние G, которое является основой для планирования G по M.
  • P-это “логический процессор”. Для того, чтобы каждый G действительно запустился, ему сначала нужно присвоить P (в локальном runq P ссылка global runq здесь игнорируется). Для G P-это “процессор”, который его запускает. Можно сказать, что в глазах G есть только P. Но с точки зрения планировщика Go реальным “процессором” является M. Только связав P и M, можно действительно запустить G в режиме P.
  • Реализация модели G-P-M является большим прогрессом планировщика Go, но у планировщика все еще болит голова из-за того, что он не поддерживает упреждающее планирование, что приводит к тому, что, как только логика кода мертвого или постоянного цикла появится в G, G выделит постоянное место для своих P и M, а другие G в том же P не будут запланированы. Есть голод. Более серьезно, когда есть только один P), другой G во всей программе Go “умрет с голоду”. Тогда что мне делать? В GO 1.2 он добавил монитор. При запуске программы Go среда выполнения запустит M, называемый Sysmon (обычно называемый потоком мониторинга), который может выполняться без привязки P. M очень важен во всем процессе запуска программы Go: выдайте упреждающее планирование для длительных задач G и восстановите длительную блокировку из-за системного вызова. П и так далее

Если G заблокирован при выполнении операции системного вызова, то не только G заблокируется, но и M, выполняющий G, отцепит P (по сути, украденный sysmon) и перейдет в состояние сна с G. Если в это время неактивен M, то P и его привязка продолжают выполнять другие G; если неактивен M, но все еще есть другие группы для выполнения, то будет создан новый M.

Справочная статья:

  1. Справочная статья:
  2. Справочная статья: