Зелені нитки проти незелених ниток


79

Я хотів би зрозуміти переваги цих типів потоків.

  • В якому середовищі зелені нитки кращі за незелені? Деякі вважають, що зелені нитки краще для багатоядерних процесорів.

  • Будь-які очікувані проблеми з поведінкою.


5
Надзвичайно малоймовірно, що зелені потоки краще для багатоядерних процесорів, оскільки вони не використовуватимуть mroe, ніж одне ядро. Якщо зелені нитки краще, тоді у вас є програма, яка не повинна використовувати нитки (іноді нитки використовуються тоді, коли їх не повинно бути)
Пітер Лорі

1
Де не слід використовувати нитки?
user1657170

Відповіді:


82

Стаття Вікіпедії « Зелені нитки» це дуже добре пояснює.

Зелені нитки - це «нитки на рівні користувача». Вони заплановані "звичайним" процесом на рівні користувача, а не ядром. Тож їх можна використовувати для імітації багатопоточності на платформах, які не надають таких можливостей.

У контексті Java, зелені нитки залишилися в минулому. Див. Статтю JDK 1.1 для Посібника розробника Solaris . (Мова йде про Solaris, але той факт, що зелені нитки більше не використовуються, справедливий для звичайних платформ).

З випуску версії 1.3 зелені нитки були залишені в Sun JVM для Linux (див. Технологію Java [tm] на платформі Linux на archive.org). Це датується 2000 роком. Для Solaris рідні потоки були доступні з JDK 1.2. Це датується 1998 роком. Я навіть не думаю, що коли-небудь застосовувалася зелена нитка для Windows, але я не можу знайти посилання на це.

Є деякі винятки, як зазначається у статті Вікіпедії, я збираюся здебільшого для малопотужних (вбудованих) пристроїв.


8
Справа давнього минулого. Минуле століття. Ваш професор повинен бути в курсі подій.
user207421

1
@ user1657170: чим вони не були? Про які технології "допоміжної різьби" ви згадуєте?
Mat

2
@ user1657170: все ще не розумію, на що ви посилаєтесь у тому, що я писав вище. Прочитайте статтю, на яку я посилався від колишнього Sun, вони відмовились від зелених ниток навколо Solaris 2.6.
Mat

4
@ user1657170: Волокна (і всі пов’язані / подібні речі, які з’явилися майже на всіх платформах в наші дні або, по суті, існували там назавжди, як в процесах Erlang), не мають нічого спільного із зеленими нитками, оскільки цей термін використовувався в Java. Звичайно, Sun / Oracle має власні потоки, і, звичайно, JVM їх використовує. Знову ж таки, якщо у вас є щось конкретне, щоб зазначити, що фактично є помилковим у вищезазначеному, будь ласка, наведіть точні джерела.
Mat

3
Як ви називаєте три посилання у тому, що я розмістив вище, особливо посилання на документи Oracle, що суперечить тому, що ви розмістили без посилання на це питання? Я закінчував відповідати на ваші коментарі до речі, це повна втрата часу.
Mat

23

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

Таким чином, перевага полягає в тому, що ви взагалі отримуєте потокоподібну функціональність. Недоліком є ​​те, що зелені нитки насправді не можуть використовувати кілька ядер.

Було кілька ранніх JVM, які використовували зелені потоки (IIRC робив порт Blackdown JVM для Linux), але сьогодні всі основні JVM використовують справжні потоки. Можливо, є деякі вбудовані JVM, які все ще використовують зелені нитки.


18
Є кілька реалізацій зелених потоків, які використовують кілька власних потоків, щоб використовувати багатоядерну або багатопроцесорну архітектуру. Сюди входять бібліотека потоків у .NET та бібліотека Quasar для Java. Обидва вони використовують стільки рідних ниток, скільки ядер, і використовують зелені нитки / волокна для додаткових ниток, балансуючи їх між рідними нитками.
user1657170

23

Пам'ять зеленого потоку виділяється з купи, а не має стек, створений для неї ОС. Це потенційно може дати на порядок або більше збільшення одночасних потоків. Як згадували інші люди, це не використало б переваги декількох процесорів автоматично, однак варіант використання зазвичай використовується для блокування вводу-виводу - наприклад, зелені потоки можуть дозволити вам обробляти 100 тис. Одночасних з'єднань на відміну від 10 тис.

Отже, іншими словами, зелені нитки краще використовувати для операцій, пов’язаних з введенням-виведенням, у певному масштабі.


3
З зеленими нитками ви насправді не маєте 100 тисяч одночасних з'єднань. Це лише ілюзія .
Pacerier

8
Технічно, з'єднання будуть одночасними, ви просто не можете одночасно обробляти їх запити.
Yike Lu,

Розташування стопки магічним чином не спричиняє прискорення.
user207421

Як зелені нитки роблять результати одночасного підключення 100 тис. На екранах клієнта? Це досить ілюзія? Чи можемо ми повторити це, маючи 3D-графіку як ілюзію на екрані, тоді як код не створює її?
user1657170

5

Зелені потоки значно швидші, ніж власні потоки, коли мають більше активних потоків, ніж процесори.

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

Потім Java видалила зелену різьбу, щоб покладатися лише на власні потоки. Це зробило Java Threads повільнішим за зелені нитки.

Зверніть увагу, що я конкретно не кажу про реалізацію Java зелених потоків, яка мала недоліки, оскільки вона, на відміну від інших наслідків зелених потоків, не може масштабуватися в багатоядерній або багатопроцесорній системі.


Зелені нитки не є значно швидшими, якщо взагалі швидшими, для обчислювальних інтенсивних завдань. Це чудовий інструмент для вирішення певних завдань.
JugsteR

Так вони є. Вони не швидше виконують обчислення, але швидше виконують потокові роботи. Вони не пропонують паралелізм, як справжні протектори. Більшість випадків різьбових потоків не пов’язані з комп’ютерними завданнями. Хоча ви можете заперечити, що люди зловживають потоками і, можливо, повинні використовувати більше державних машин і вписувати те, що вони роблять, у процедурне програмування.
user1657170

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

4

Зелені потоки - це потоки рівня користувача, а не потоки рівня ядра. Вони заплановані користувацькими бібліотеками, а не ядром. Ви можете мати власний механізм планування для планування потоків, а не покладатися на планувальник ОС.

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

Виконання:

На багатоядерному процесорі реалізації рідних потоків можуть автоматично призначати роботу кільком процесорам, тоді як реалізації зелених потоків зазвичай не можуть. Зелені потоки значно перевершують рідні потоки Linux за активацією та синхронізацією потоків.

Коли зелений потік виконує блокуючий системний виклик, блокується не тільки цей потік, але й усі потоки в процесі.


1
Як заблоковані всі зелені нитки в процесі? Що робити, якщо в цьому процесі є декілька потоків ядра та служба-виконавець, яка надсилає на них зелені потоки? Що робити, якщо потік, який робить syscall, просто не отримує інших завдань? Ваша претензія відповідає дійсності лише в однопотоковому середовищі.
marctrem

2
Що я мав на увазі, скажімо, є 1 потік ядра для n зелених потоків процесу, а 1 зелений потік робить виклик блокування (який обробляє потік одного ядра), тоді весь зелений потік, що відповідає цьому потоку ядра, буде заблокований. Очевидно, що це не справедливо для m потоків ядра, зіставлених із n зеленими потоками для процесу. У будь-якому випадку ви не можете сказати, що це однопотокове середовище - це залежить від планування потоку ядра.
Aniket Thakur,

2

Зелені потоки не заплановані ОС.

Це означає, що планування для них відбувається в просторі користувачів і не обробляється ядром. Це означає, що зелені потоки зазвичай не можуть бути використані для використання всіх ядер процесора.

Для будь-якої основної платформи, на якій сьогодні працює Java (наприклад, x86 або x64), ви будете використовувати справжні потоки.


4
Немає жодної причини, через яку зелені потоки не можуть використовувати декілька процесорів. Див., Наприклад, GHC та Go.
праворуч

2

JAVA Multi-Threading реалізована двома моделями:

  1. Модель зеленої нитки
  2. Власна модель ОС

Модель Green Thread: Нитка, якою керує JVM, без використання базової підтримки ОС, називається Green Thread. Дуже мало ОС, як Sun Solaris, підтримують модель зелених ниток. Він застарілий і не рекомендується використовувати.

Рідна модель ОС: Потік, який керується JVM за допомогою базової ОС, називається рідною моделлю ОС. Усі ОС Windows забезпечують підтримку власної моделі ОС.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.