Поняття нитки (threads)
Поняття "легкого процесу" (light-weight process), або, як прийнято називати його в сучасних варіантах ОС UNIX, "thread" (нитка, потік управління) давно відомо в області операційних систем. Інтуїтивно зрозуміло, що концепції віртуальної пам'яті і потоку команд, що виконується в цій віртуальній пам'яті, в принципі, ортогональні. Ні з чого не випливає, що однією віртуальної пам'яті повинен відповідати один і тільки один потік управління. Тому, наприклад, в ОС Multics допускалося мати довільну кількість процесів, які виконуються в загальною (що розділяється) віртуальної пам'яті.
Зв'язування процесу з віртуальної пам'яттю породжує, принаймні, дві проблеми. Перша проблема пов'язана з так званими системами реального часу. Такі системи, як правило, призначені для одночасного управління декількома зовнішніми об'єктами і найбільш природно представляються у вигляді сукупності "паралельно" (або "квазіпараллельний") виконуваних потоків команд (тобто взаємодіючих процесів). Однак якщо з кожним процесом пов'язана окрема віртуальна пам'ять, то зміна контексту процесора (тобто його перемикання з виконання одного процесу на виконання іншого процесу) є відносно дорогою операцією, тому традиційний підхід ОС UNIX перешкоджав використанню системи в додатках реального часу.
Другий (і може бути більш істотною) проблемою стала поява так званих симетричних мультипроцесорних комп'ютерної архітектури (SMP - Symmetric Multiprocessor Architectures). У таких комп'ютерах фізично присутні кілька процесорів, які мають однакові за швидкістю можливості доступу до спільно використовуваної основної пам'яті. До моменту появи SMP з'ясувалося, що технологія програмування все ще не може запропонувати ефективного і безпечного способу реального паралельного програмування. Тому довелося повернутися до явного паралельного програмування з використанням паралельних процесів в загальним віртуальним (а тим самим і основний) пам'яті з явною синхронізацією.
Нитка (thread) - це незалежний потік управління, що виконується в контексті деякого процесу. Фактично, поняття контексту процесу змінюється наступним чином. Все, що не відноситься до потоку управління (віртуальна пам'ять, дескриптори відкритих файлів і т.д.), залишається в загальному контексті процесу. Речі, які характерні для потоку управління (реєстровий контекст, стеки різного рівня і т.д.), переходять з контексту процесу в контекст нитки. Загальна картина показана на рис.3.4.
Рис.3.4. Співвідношення контексту процесу і контекстів ниток
Як видно з цього малюнка, всі нитки процесу виконуються в його контексті, але кожна нитка має свій власний контекст. Контекст нитки, як і контекст процесу, складається з користувальницької і ядерної складових. Призначена для користувача складова контексту нитки включає індивідуальний стек нитки. Оскільки нитки одного процесу виконуються в загальній віртуальної пам'яті (всі нитки процесу мають рівні права доступу до будь-яких частин віртуальної пам'яті процесу), стек (сегмент стека) будь-нитки процесу в принципі не захищений від довільного (наприклад, через помилки) доступу з боку інших ниток. Ядерна складова контексту нитки включає її регістровий контекст (зокрема, вміст регістра лічильника команд) і динамічно створювані ядерні стеки.
Наведене коротке обговорення поняття нитки здається достатнім для того, щоб зрозуміти, що впровадження в ОС UNIX механізму легковагих процесів вимагає істотних переробок ядра системи.