переміщається разом з ним, якщо це необхідно, з ОП на диск. У UNIX для процесів передбачені два режими виконання: привілейований режим - "система" і звичайний режим - "користувач". У режимі "користувач" заборонено виконання дій, зв'язаних з керуванням ресурсами системи, зокрема, коректування системних таблиць, керування зовнішніми пристроями, маскування переривань, обробка переривань. У режимі "система" виконуються програми ядра, а в режимі "користувач" - оболонка і ПП. При необхідності виконати привілейовані дії користувальницький процес звертається з запитом до ядра у формі так називаного системного виклику. У результаті системного виклику керування передається відповідній програмі ядра. З моменту початку виконання системного виклику процес вважається системним. Таким чином, той самий процес може знаходитися в користувацькій і системній фазах. Ці фази ніколи не виконуються одночасно.
У даних версіях UNIX процес, що працює в режимі системи, не міг бути витиснутий іншим процесом. Через це організація ядра, що складає привілейовану загальну частину всіх процесів, спрощувалася, тому що усі функції ядра не були рентабельними. Однак, при цьому реактивність системи страждала - будь-який процес, навіть низькоприорітетний, ввійшовши в системну фазу, міг залишатися в ній як завгодно довго. Через цю властивість UNIX не міг використовуватися в якості ОС реального часу. У більш пізніх версіях, і в SVR4 у тому числі, організація ядра ускладнилася і процес можна витиснути й у системній фазі, але не в довільний момент часу, а тільки у визначені періоди його роботи, коли процес сам дозволяє це зробити установкою спеціального сигналу.
1.3. Зародження процесів
Зародження процесів в системі UNIX відбувається таким способом. При створенні процесу будується образ нового процесу, що є точною копією образу вихідного процесу. Сегмент даних і сегмент стeку батька реально копіюються на нове місце, утворюючи сегменти даних і стеку сина. Процедурний сегмент копіюється тільки тоді, коли він нероздільний. В іншому випадку син стає ще одним процесом, що займає даний процедурний сегмент.
Після виконання системного виклику fork обидва процеси продовжують виконання з одної і тої ж точки. Щоб процес міг опізнати, чи є він батьком чи сином, системний виклик fork повертає в якості свого значення в початковий процес ідентифікатор нового процесу, а в новий процес NULL. Типове розгалуження на мові C записується так:
if( fork() ) { дії батька }
else { дії сина }
Ідентифікатор сина може бути присвоєний змінній, яка входить в контекст процесу-батька. Так як контекст процесу успадковується його потомками, то діти можуть узнати ідентифікатори своїх старших братів, таким чином сума знань успадковується при породженні і може бути розповсюджена між спорідненими процесами. успадковуються всі характеристики процесу, що містяться в контексті.
На незалежності ідентифікатора процесу від виконуваної процесом програми побудований механізм, що дозволяє процесу прийти до виконання іншої програми за допомогою системного виклику exec.
Таким чином в UNIX породження нового процесу відбувається в два етапи - спочатку створюється копія процесу-батька, а саме дублюється дескриптор, контекст і образ процесу. Потім у нового процесу проводиться заміна кодового сегмента на заданий.
1.4. Керування пам'яттю. Свопінг.
У UNIX System V Release 4 реалізована сегментно-сторінкова модель пам'яті в її традиційному виді. Поряд з механізмом керування сторінками використовується і механізм свопінгу, коли на диск виштовхуються всі сторінки якого-небудь процесу. Свопінг застосовується в "передаварійних" ситуаціях, коли розмір вільної ОП зменшується до деякого заданого порога, так що робота всієї системи дуже ускладнюється.
Маються наступні типи віртуальних сегментів:
Текст (text) - містить коди команд модуля процесу, що виконується. Він звичайно позначається "тільки для читання", так щоб ні сам процес, ні інші процеси не могли змінити його кодову частину. Текстовий сегмент може розділятися багатьма процесами, наприклад, усіма користувачами, що працюють з одним редактором.
Дані (data) - містить дані, використані і модифіковані процесом під час виконання. До сегмента даних звичайно дозволяється мати доступ для читання і запису. На відміну від текстового сегмента, сегмент даних ніколи не розділяється іншими процесами.
Стік (stack) - містить стек процесу. Він позначається доступним для читання і запису і, подібно сегменту даних, не може розділятися іншими процесами.
Є ще два типи сегментів:
Поділювана пам'ять (shared memory) - область пам'яті, доступна для читання і запису декільком процесам.
Відображений файл (mapped file) - сегменти відображеного файлу використовуються для того, щоб відобразити частини файлів в адресний простір процесу, і використовувати стандартні механізми ОС керування ВП для прискорення доступу до файлів.
Поле s_data дескриптора сегмента вказує на структуру даних segvn_dat, у якій міститься специфічна для сегмента інформація:
type: ознака, чи є сегмент поділюваним чи особистим;
vp і offset: покажчик на vnode файлу і зсув у цьому файлі, що задають адреса, починаючи з якої розташовані на диску дані цього сегмента;
amp: покажчик на карту анонімних сторінок сегмента.
Кожен сегмент має зв'язок з дисковим простором, на якому зберігаються дані, відображувані в даний сегмент ВАП. Це може бути файл чи частина файлу на диску, чи ж це може бути область свопінгу, що не є файлом. Сегмент чи код сегменту інціалізованих даних звичайно зв'язаний з файлом, у якому зберігається програма, що виконується. Під зв'язком з файлом розуміється відображення віртуального сегмента і його сторінок на визначену область диска, з якої завантажуються дані віртуальних сторінок сегмента при їхньому переміщенні в ОП, а також куди містяться дані при витисненні віртуальних сторінок на диск. Віртуальні сторінки, що були споконвічно узяті з визначеного файлу (який описується на рівні