Абстрактна модель емуляції UNІХ на основі Mach
2.4. Керування процесами в Mach
Процес у Mach - це, у першу чергу, адресний простір і набір ниток, що виконуються в цьому адресному просторі. Таким чином, виконання зв'язане з нитками, а процеси є пасивними об'єктами і служать для збору всіх ресурсів, що використовуються групою взаємозалежних ниток, у зручні контейнери.
Інші параметри процесу
Рис. 46. Процес Mach
Малюнок 46 ілюструє процес у Mach. Крім адресного простору і ниток, процес характеризується використовуваними ними портами і деякими параметрами. Усі порти, показані на малюнку, мають спеціальне призначення. Порт процесу використовується для взаємодії з ядром. Багато функцій ядра процес може викликати шляхом відправлення повідомлення на порт процесу, а не за допомогою системного виклику. Цей механізм використовується в Mach усюди для зменшення кількості системних викликів до можливого мінімуму. Взагалі говорячи, програміст може навіть не знати, чи виконується сервіс за допомогою системного виклику чи ні. Усім сервісам, які викликаються як за допомогою системних викликів, так і за допомогою передачі повідомлень, відповідають ерзац-процедури (заглушки) у бібліотеці. Це саме ті процедури, що описані в посібниках і які викликаються ПП. Ці процедури генеруються на підставі опису сервісу за допомогою компілятора MІG (Mach Іnterface Generator).
Порт завантаження використовується при ініціалізації, коли система стартує. Найперший процес читає з порту завантаження, щоб довідатися імена портів ядра, що забезпечують найбільш важливі сервіси.
Порт особливих ситуацій використовується системою для передачі повідомлень про помилки процесу. Прикладами особливих ситуацій є ділення на нуль, неправильний код команди. Цей порт також використовують відладчики.
Зареєстровані порти звичайно використовуються для забезпечення можливостей взаємодії між процесами і стандартними системними серверами.
Процеси також володіють і іншими властивостями. Процес може бути виконуваним чи заблокованим, незалежно від стану його ниток. Якщо процес є виконуваним, то ті його нитки, що також готові до виконання, можуть плануватися і виконуватися. Якщо процес заблокований, то всі його нитки не можуть виконуватися незалежно від їхнього стану.
Параметри планування, крім ниток, визначаються також для процесів. Ці параметри включають можливість визначення того, на яких процесорах можуть виконуватися нитки даного процесу. Це властивість найбільш корисна для багатопроцесорних систем. Наприклад, процес може використовувати цю властивість для того, щоб змусити виконуватися нитку на різних процесорах, чи змусити всі нитки працювати на одному процесорі, чи реалізувати який-небудь проміжний варіант. Крім того, кожен процес має пріоритет, який можна встановлювати. При створенні нитки їй привласнюється цей пріоритет. Також є можливість змінювати пріоритет всіх існуючих ниток.
Нарешті, кожен процес має статистику, наприклад, про кількість використовуваної пам'яті, час виконання ниток і т.д. Будь-який інший процес, що цікавиться цією статистикою, може отримати її, пославши повідомлення на порт даного процесу.
Процес Mach не містить: ідентифікатора користувача, груповий ідентифікатор, маску сигналів, кореневий каталог, робочий каталог, масив дескрипторів файлів. Уся ця інформація міститься в параметрах процесу на рівні сервера користувацького режиму.
Примітиви керування процесами
Mach передбачає невелику кількість примітивів керування процесами. Більшість з них виконується шляхом посилки повідомлення ядру через порт процесу. Найбільш важливі з цих викликів приведені в таблиці 3.
Таблия 3.
Виклик Опис
Create Створює новий процес, що успадковує деякої властивості
Termіnate Завершує визначений процес
Suspend Нарощує лічильник припинень
Resume Зменшує лічильник припинень; якщо він дорівнює 0, то
розблокує процес
Prіorіty Встановлює пріоритет для існуючих чи майбутніх ниток
Assіgn Говорить, на якому процесорі повинні виконуватися нові нитки
Іnfo Повертає інформацію про час виконання, використовуваної
пам'яті і т.д.
Threads Повертає список ниток процесу
Процеси можуть бути припинені і відновлені за допомогою програмного керування. Кожен процес має лічильник, нарощуваний викликом Suspend і зменшуваний викликом Resume, що можуть блокувати і розблокувати його. Коли лічильник дорівнює 0, то процес може виконуватися. Наявність лічильника дозволяє уникнути проблем.
Виклики Prіorіty і Assіgn дозволяють програмісту керувати тим, як і де нитки виконуються в багатопроцесорній системі. Планування CPU виконується на основі пріоритетів, так що програміст може визначати, які нитки більш важливі, а які - менш важливі.
Нитки
Активними об'єктами в Mach є нитки. Усі нитки процесу розділяють один адресний простір і мають загальні в межах процесу ресурси (рис. 46). Крім того, кожна нитка має і свої особливі ресурси. Одним з таких ресурсів є порт нитки, що є аналогом порту процесу і який використовується ниткою для того, щоб викликати спеціальні, орієнтовані на нитці, сервіси ядра, наприклад, функцію завершення нитки. Тому що порти є загальними ресурсами для всіх ниток одного процесу, кожна нитка має доступ до портів своїх ниток-братів, у такий спосіб кожна нитка може керувати іншою ниткою, якщо це необхідно. Нитки Mach керуються ядром, тобто вони є тим, що іноді називають "великоваговими" нитками, на відміну від "легковагих" ниток (ниток, що цілком виконуються в користувацькому просторі). Створення і знищення ниток здійснюється ядром і включає відновлення структур дані ядра. Нитки ядра надають базові механізми для керування безліччю "активностей" у загальному адресному просторі. Що робити з цими механізмами - це справа користувача.
Рис. 47. Варіанти реалізацій З-ниток
(а) - Усі C-нитки використовують одну нитку ядра;
(б) - Кожна C-нитка має свою власну нитку ядра;
(в) - Кожна C-нитка має свій власний однонитковий процес
2.4.1. Реалізація З-ниток у Mach
У Mach існує кілька реалізацій 3-ниток. Оригінальна реалізація виконує всі нитки в користувацькому просторі усередині одного процесу. Цей підхід заснований на поділі в часі всіма 3-нитками однієї нитки ядра, як це показано на малюнку 47,а. Цей підхід