Чи є басейни goroutine go-langs зеленими нитками?


47

Тут коментатор пропонує наступну критику зелених ниток:

Спочатку я продавався на моделі N: M як засіб програмування, керованого подіями, без пекла зворотного виклику. Ви можете писати код, який виглядає як больовий старий процедурний код, але під ним є магія, яка використовує комутацію завдань у просторі користувачів, коли щось блокується. Звучить чудово. Проблема полягає в тому, що ми закінчуємо вирішення складності з більшою складністю. swapcontext () та сімейство є досить прямими, складність виникає з інших непередбачуваних місць.

Раптом ви змушені написати планувальник простору користувачів і здогадуєтесь, що насправді важко написати планувальник, який зробить кращу роботу, ніж графіки Linux, на які вкладено багато років зусиль. Тепер ви хочете, щоб ваш графік мав N зелених ниток до M фізичних потоків, тому вам доведеться турбуватися про синхронізацію. Синхронізація спричиняє проблеми з продуктивністю, тому ви почнете зараз, коли ви знаходитесь у новій беззубій кролячій норі. Побудувати правильний висококласний планувальник - завдання не з легких.

Ще одна критика тут :

Один процес підроблення декількох потоків має безліч проблем. Один з них полягає в тому, що всі підроблені нитки застоюються на помилках будь-якої сторінки.

Моє запитання - чи є підпрограми go-lang (для пулу за замовчуванням) лише зеленими нитками? Якщо так - чи звертаються вони до критики вище?

Відповіді:


67

Я лише випадковий користувач Go, тому візьміть наступне із зерном солі.

Вікіпедія визначає зелені нитки як "потоки, які заплановані віртуальною машиною (VM), а не первісно базовою операційною системою". Зелені нитки емулюють багатопотокові середовища, не покладаючись на будь-які нативні можливості ОС, і ними керують у просторі користувача, а не в просторі ядра, що дозволяє їм працювати в середовищах, які не мають підтримки рідних потоків.

Перехід (або точніше дві існуючі реалізації) - це мова, що створює лише власний код - він не використовує VM. Крім того, планувальник у поточних реалізаціях виконання покладається на потоки рівня ОС (навіть коли GOMAXPROCS = 1). Тож я думаю, що говорити про зелені нитки для моделі Go трохи зловживає.

Люди придумали термін goroutter, особливо щоб уникнути плутанини з іншими механізмами одночасності (такими як супроводи або потоки чи легкі процеси).

Звичайно, Go підтримує модель різьблення M: N, але вона виглядає набагато ближче до моделі процесу Ерланг, ніж до моделі зелених ниток Java.

Ось кілька переваг моделі Go над зеленими нитками (як реалізовано на початку JVM):

  • Кілька ядер або процесорів можна ефективно використовувати прозоро для розробника. З Go, розробник повинен подбати про одночасність. Пробіг Go подбає про паралелізм. Реалізація зелених ниток Java не розширюється на декілька ядер чи процесорів.

  • Системні та виклики C не блокують планувальника (усі системні виклики, не тільки ті, що підтримують мультиплексоване введення / виведення у циклі подій). Реалізація зелених ниток може блокувати весь процес, коли було здійснено блокування виклику системи.

  • Копіювання або сегментування стеків. У програмі Go немає необхідності вказувати максимальний розмір стека для програми. Стек зростає поступово по мірі необхідності. Одним із наслідків є те, що програма не вимагає великої кількості пам'яті (4 КБ-8 КБ), тому величезна кількість з них може бути щасливо породжена. Тому використання програмних засобів може бути широко поширеним.

Тепер, щоб вирішити критику:

  • За допомогою Go вам не потрібно писати планувальник простору користувачів: він уже забезпечений під час виконання. Це складне програмне забезпечення, але це проблема розробників Go, а не користувачів Go. Його використання прозоре для користувачів Go. Серед розробників Go, Дмитро Вюков є експертом у програмі програмування безвізних / чекань, і він, схоже, особливо зацікавлений у вирішенні можливих проблем планувальника. Поточна реалізація планувальника не є досконалою, але вона покращиться.

  • Синхронізація приносить проблеми та складність продуктивності: частково це стосується і Go. Але зауважте, що модель Go намагається сприяти використанню каналів та чистому розкладу програми в паралельних програмах для обмеження складності синхронізації (тобто обмін даними шляхом спілкування, а не обмін пам'яттю для спілкування). До речі, довідкова реалізація Go надає низку інструментів для вирішення проблем продуктивності та одночасності, як-от профілер та детектор гонки .

  • Щодо помилок сторінки та "підроблених декількох потоків", будь ласка, зверніть увагу, що Go може запланувати програму для декількох системних потоків. Якщо з будь-якої причини блокується один потік (помилка сторінки, блокування системних викликів), це не заважає іншим потокам продовжувати планувати та виконувати інші програми. Тепер, правда, що помилка сторінки блокує потік ОС, при цьому всі гарантії повинні бути заплановані на цьому потоці. Однак на практиці пам'ять Go heap не має бути заміненою. Це було б те саме в Java: зібрані сміття мови все одно не вміщують віртуальну пам'ять. Якщо ваша програма повинна граціозно поводитись з помилками сторінки, якщо це, мабуть, тому, що вона має керувати якоюсь невичерпною пам'яттю. В такому разі,

Таким чином, IMO, гороутини не є зеленими нитками, а мова Go і поточна реалізація здебільшого вирішують ці критики.


1
Відмінна і детальна відповідь на питання :)
Tuxdude

1
Я люблю цю відповідь, але чи є у вас посилання на те, як / коли створюються OS-потоки?
Ларс

1
Один з найбільших недоліків Go Language - це створення нитки ядра для кожного блокування виклику системи!
користувач1870400

8
Зауважте, що статтю "зеленої нитки" у Вікіпедії було змінено на "потоки, заплановані бібліотекою виконання або віртуальною машиною (VM)"; що означає, що за цим визначенням ваша відповідь більше не буде правильною, оскільки час виконання програми виконує планування / управління. Я думаю, що корисніше визначити зелені нитки як потоки користувальницького простору, що протиставляють OS-потоки. І тоді, так, гороутини - це точно зелені нитки.
mknecht

1
2-е що @mknecht. Не про ВМ, а про час виконання. І Go обов'язково має час виконання. (яка управляє моделлю різьблення та збирання сміття).
Тім Харпер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.