Процеси - загальні відомості
Процес Unix/Linux являє собою одиницю роботи обчислювальної системи, якої операційна система виділяє ресурси. З деякою мірою наближення можна визначити процес як виконувану програму. Кожен процес в системі має свій унікальний ідентифікатор процесу (PID), що цілим числом.
Кожному процесу в операційній системі відповідає запис у таблиці
процесів і адресний простір процесу. Запис у таблиці процесів (і її
розширення в адресному просторі процесу) містить керуючу інформацію про
ресурсах, виділених процесу, і про стан процесу. Адресний простір
містить коди і дані процесу.
Процес може породжувати інший процес. Породження нового процесу в Linux (Unix)
реалізовано копіюванням запису таблиці процесів, таким чином, що
процес-нащадок в момент свого породження являє собою точну копію
процесу-предка. Це називається створення процесу. Процес-попередник та процес-нащадок далі виконуються
паралельно, але процес-попередник може очікувати завершення процесу-нащадка.
Процеси в Unix/Linux виконуються в режимі поділу часу, це означає,
що час центрального процесора рівномірно (з урахуванням пріоритетів)
розподіляється між усіма готовими до виконання процесами. Навіть якщо процес
не переходить у стан очікування (наприклад, очікування виконання операції
введення-виведення) за своєю ініціативою, після виділеного процесу кванта
часу виконання процесу буде перервано операційною системою, і процесор
буде віддано більше пріоритетного процесу. Unix/Linux застосовує динамічне
перевычисление пріоритетів, пріоритет виконується процесу знижується, а
пріоритети чекаючих процесів підвищуються.
Породження процесів в Linux
Новий процес породжується системним викликом fork,
який створює дочірній процес - копію батьківського. У нащадку
виконується та ж програма, що і в батьківському, і коли дочірній процес
починає виконуватися, він виконується з точки повернення з системного виклику
fork. Системний виклик fork
возвращает батьківського процесу PID дочірнього процесу, а дочірнього процесу
- 0. За кодом повернення виклику fork дочірній
процес може "усвідомити себе як дочірній. Свій PID процес може отримати при
допомогою системного виклику getpid,
а PID батьківського процесу - за допомогою системного виклику
getppid. Якщо потрібно, щоб у нащадку
виконувалася програма, відмінна від програми батьківського процесу, процес
може змінити виконувану в ньому програму за допомогою одного з системних
викликів сімейства exec. Всі виклики
цього сімейства download для виконання в процесі програму з заданого в
виклик файлу і відрізняються один від одного способом передачі параметрів цієї
програмі. Таким чином, найбільш поширений контекст застосування
системного виклику fork виглядає
приблизно так:
/* породження дочірнього процесу і запам'ятовування його PID */
if (!(ch_pid=fork())
/* завантаження іншої програми в нащадку */
exec(програма);
else
продовження батьківського процесу