може також використовуватися в UNіX'і чи будь-якій іншій системі, у якій немає підтримки ниток ядром. Такі нитки працюють як різні підпрограми однієї програми, що означає, що вони плануються образом, що невитісняє. Наприклад, у випадку типової задачі "виробник-покупець" виробник повинний заповнити буфер, а потім заблокуватися, щоб дати шанс покупцю на виконання.
Дана реалізація має недолік, властивий усім нитковим пакетам, що працюють у користувацькому просторі без підтримки ядра. Якщо одна нитка виконує системний виклик, що блокує, наприклад, читання з термінала, то блокується весь процес. Щоб уникнути цієї ситуації, програміст повинен уникати використовувати системні виклики, що блокують.
Друга реалізація використовує одну Mach-нитку для однієї 3-нитки, як показано на малюнку 47, б. Ці нитки плануються з витісненням. У багатопроцесорних системах нитки можуть дійсно працювати паралельно на різних процесорах. Фактично можливо мультиплексуваня m користувацьких ниток з n нитками ядра, хоча найбільш загальним випадкам є n=m.
У третій реалізації для кожного процесу виділяється одна нитка ядра, як показано на малюнку 47, в. Процеси реалізуються так, що їхні адресні простори відображаються в ту саму фізичну пам'ять, дозволяючи розділяти її тим же способом, що й у попередніх реалізаціях. Даний спосіб підтримки ниток використовується тільки тоді, коли потрібно спеціалізоване використання ВП. Недоліком цього методу є те, що порти, UNіX-файли й інші ресурси процесу не можуть розділятися.
Основне практичне значення першого підходу полягає в тому, що в умовах відсутності щирого паралелізму послідовне виконання нитки дозволяє відтворювати проміжні результати, полегшуючи процес налагодження.
2.5. Керування пам'яттю в Mach
Ядро Mach має потужну, ретельно розроблену і найвищою мірою гнучку систему керування пам'яттю, засновану на сторінковому механізмі і яка має багато своєрідних властивостей. Зокрема, у ній машинно-залежна частина коду відділена від машинно-незалежної частини надзвичайно ясним і незвичайним способом. Цей поділ робить керування пам'яттю більш мобільним, ніж в інших системах. Крім того, система керування пам'яттю тісно взаємодіє з комунікаційною системою.
Однієї з основних особливостей системи керування пам'яттю Mach є те, що її код розбитий на три частини. Перша частина називається pmap, що працює в ядрі і займається роботою з пристроєм відображення ВА у фізичні (Memory Management Unіt, MMU). Ця частина встановлює значення регістрів MMU і апаратних сторінкових таблиць, а також перехоплює всі сторінкові переривання. Ця частина коду залежить від архітектури MMU і повинна бути переписана для кожної нової машини кожний раз, коли Mach на неї переноситься. Друга частина - це машинно-незалежний код ядра, і він зв'язаний з обробкою сторінкових збоїв, керує відображенням областей пам'яті і заміною сторінок.
Третя частина коду працює в користувацькому просторі як процес, називаного "менеджер пам'яті" (memory manager) чи іноді "зовнішній менеджер сторінок" (external pager). Ця частина має справу з логічними аспектами (на відміну від фізичних) системи керування пам'яттю, в основному, з керуванням збереження образів пам'яті на диску. Наприклад, менеджер пам'яті відслідковує інформацію про те, які віртуальні сторінки використовуються, які знаходяться в ОП і де вони зберігаються на диску, коли не знаходяться в ОП. Ядро і менеджер пам'яті взаємодіють за допомогою добре визначеного протоколу, що дає можливість для користувачів ядра Mach писати свої власні менеджери пам'яті. Такий поділ обов'язків дозволяє реалізовувати сторінкові системи спеціального призначення. При цьому ядро стає потенційно менше і простіше, тому що значна частина коду працює в користувацькому просторі. З іншого боку, це і джерело ускладнення ядра, тому що при цьому воно повинно захищати себе від помилок некоректної роботи менеджера пам'яті. Крім того, при наявності двох активних частин системи керування пам'яттю можливе виникнення конфліктів між ними.
2.5.1. Віртуальна пам'ять
Концептуально модель пам'яті в Mach виглядає для користувацьких процесів у виді великого лінійного ВАП. Для більшості 32-х розрядних процесорів адресний простір займає діапазон від 0 до 232 - 1 (4 Гбайта). Адресний простір підтримується сторінковим механізмом.
Mach забезпечує дуже тонке керування механізмом використання віртуальних сторінок (для тих процесів, що цікавляться цим). Для початку скажемо про те, що адресний простір може використовуватися розрідженим способом. Наприклад, процес може мати дюжину секцій ВАП, кожна з який знаходиться на відстані сотень Мбайт від найближчого сусіда, з великими зазорами не використовуваного адресного простору між цими секціями.
Теоретично будь-який ВАП може бути розрідженим, так що здатність використовувати велику кількість розкиданих секцій не є в дійсності властивістю архітектури ВП. Іншими словами, будь-яка 32-х бітна машина повинна дозволяти процесу мати 50 000 секцій даних, розділених проміжками по 100 Мбайт, у межах від 0 до 4 Гбайт. Однак, у багатьох реалізаціях лінійна сторінкова таблиця від 0 до самої старшої використовуваної сторінки зберігається в пам'яті ядра. На машині з розміром сторінки в 1 Kб ця конфігурація вимагає 4 мільйони елементів таблиці сторінок, роблячи таку схему дуже дорогою, якщо не неможливою. Навіть при багаторівневій організації сторінкової таблиці така розрідженість у кращому випадку неприйнятна. У ядрі Mach при його розробці споконвічно ставилася задача повної підтримки розріджених адресних просторів.
Для того, щоб визначити, які ВА використовуються, а які ні, Mach забезпечує спосіб призначення і скасування секцій ВАП, називаних областями (regіons). У виклику для призначення області можна визначити базові адреса і розмір, і область виділяється там, де це зазначено. В іншому випадку може бути заданий тільки розмір області, а система сама знаходить придатний діапазон адрес і повертає базову адресу. ВА є дійсним тільки в тому