Яка різниця між потоками на рівні користувача та потоками на рівні ядра?


33

Прочитавши кілька джерел, я все ще плутаюсь щодо потоків на рівні користувача та ядра.

Зокрема:

Нитки можуть існувати як на рівні користувача, так і на рівні ядра

Яка різниця між рівнем користувача та рівнем ядра?


1
Це насправді Comp Sci (теорія) чи просто програмування?
Мехрдад

6
@Mehrdad, Операційні системи є частиною інформатики.
Kaveh

Відповіді:


28

Однією з ролей ядра багатозадачної операційної системи є планування : визначення того, який потік виконання потрібно виконати, коли. Тож таке ядро ​​має певне поняття нитки чи процесу . Потік - це послідовний фрагмент коду, який виконується, і має власний стек, а іноді й інші дані. У контексті операційної системи люди зазвичай використовують процес для позначення потоку, який має власний простір пам’яті, а нитка - для потоку, який розділяє простір пам’яті з іншими потоками. Процес може мати одну або кілька потоків.

Деякі операційні системи, наприклад, старіші системи Unix, забезпечують лише процеси: кожен потік, яким керує ядро, має власний простір пам'яті. Інші операційні системи, наприклад, більшість сучасних систем Unix, дозволяють процесам містити кілька потоків виконання: вони забезпечують уявлення про рівні ядра.

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

Система може пропонувати як на рівні ядра, так і на рівні користувача; це відомо як гібридна різьба .

Нитки на рівні користувача та ядра мають свої переваги та недоліки. Перемикання між потоками на рівні користувача часто відбувається швидше, тому що для переходу до планувальника в ядрі та знову повернення до процесу не потрібно скидати захист пам’яті. В основному це стосується масово сумісних систем, які використовують велику кількість дуже короткотривалих потоків, таких як деякі мови високого рівня ( зокрема Ерланг ) та їх зелені нитки . Нитки на рівні користувача потребують меншої підтримки ядра, що може зробити ядро ​​простішим. Нитки рівня ядра дозволяють запускати потік, тоді як інший потік у цьому ж процесі блокується в системному виклику; процеси з потоками рівня користувача повинні стежити за тим, щоб не здійснювати блокування системних викликів, оскільки вони блокують усі потоки процесу. Нитки рівня ядра можуть працювати одночасно на багатопроцесорних машинах, чого чисто потоки рівня користувача не можуть досягти.


У вашому останньому рядку написано: "Нитки рівня ядра можуть працювати одночасно на багатопроцесорних машинах, чого чисто потоки рівня користувача не можуть досягти". Але, за даним посиланням, говорить, що ULT може одночасно працювати stackoverflow.com/questions/14791801/… . Хіба я щось не став?
Гаррік

Чи можете ви, будь ласка, перевірити мій вище коментар?
Гаррік

1
@Garrick Кілька потоків на рівні користувача можуть одночасно працювати на різних ядрах, за умови, що вони працюють у різних потоках рівня ядра. Якщо у вас є лише інструмент ULT, ви обмежуєтесь одним процесором. Якщо KLT доступний, ви можете поширити потоки ядра по декількох процесорах і відправити свій ULT серед доступних потоків ядра.
Жиль "ТАК - перестань бути злим"

4

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

Ось факти

  • Створення нового віртуального процесора трохи дорого. (Ядро має створити запис у блоці управління потоком , призначити стек тощо)

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

Моделі

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

  • Це обмеження можна подолати, якщо можна створити ще кілька віртуальних процесорів. Тепер потоки можуть працювати одночасно (паралельно, якщо є кілька реальних процесорів). Потік не вплине на інші потоки, відображені на інших віртуальних процесорах.

  • В останній моделі будь-який або багато потоків можна відобразити на віртуальних процесорах.

  • Вищеописані моделі мають назву «Багато до одного», «Один до одного» та «Багато до багатьох» відповідно.

Референції: Концепції операційної системи Galvin et al. Тема: Нитки -> Багатопотокові моделі

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