52
конуватися той же потік, але вже в режимі ядра. Тому в кожного
потоку два стеки, один працює в режимі ядра, інший – у режимі
користувача. Один і той самий стек не може використовуватися і
в режимі користувача, і в режимі ядра. Будь-який потік може ро-
бити все що завгодно зі своїм власним стеком (стеком режиму
користувача), зокрема організовувати декілька стеків і перемика-
тися між ними. Потік сам може визначати розмір свого стека.
При цьому не можна гарантувати, що стек матиме достатній роз-
мір, щоб код ядра виконався без жодних проблем. Оскільки
виникнення виняткової ситуації в режимі ядра може призвести до
краху всієї системи, необхідно виключити таку можливість, що і
здійснюється шляхом організації окремого стека для режиму яд-
ра. Оскільки в режимі ядра можуть одночасно знаходитися декі-
лька потоків і між ними може відбуватися перемикання, в кожно-
го з них повинен бути окремий стек режиму ядра.
Крім стану, ідентифікатора і двох стеків, у кожного потоку є
контекст, маркер доступу, а також невелика власна пам’ять для
зберігання локальних змінних, наприклад для запам’ятовування
коду помилки. Оскільки процес є контейнером ресурсів усіх вхід-
них у нього потоків, будь-який потік може дістати доступ до всіх
об’єктів свого процесу, незалежно від того, яким потоком даного
процесу цей об’єкт створений.
Волокна і завдання
Перемикання між потоками займає досить багато часу, тому
для полегшеного псевдопаралелізму в системі підтримуються во-
локна (fibers). Наявність волокон дозволяє реалізувати власний
механізм планування, не використовуючи вбудований механізм
планування потоків на основі пріоритетів. ОС не знає про зміну
волокон, для управління волокнами немає і справжніх системних
викликів, проте є виклики Win32 API ConvertThreadToFiber,
CreateFiber, SwitchToFiber і т.д. Докладніше функції, пов’язані з
волокнами, описані у відповідній документації.
У системі є також завдання (job object), які забезпечують
управління одним або кількома процесами як групою.