Управління процесами в linux

Процес - це абстракція, яка використовується для опису виконується програми. Процес являє собою системний об'єкт, за допомогою якого можна контролювати звернення програми до пам'яті, центрального процесора і ресурсів введення-виведення. В операційних системах Linux і Unix системні і призначені для користувача процеси підкоряються одним і тим же правилам, завдяки чому управління здійснюється за допомогою єдиного набору команд.

У структурі даних ядра зберігається всіляка інформація про кожному процесі. До найбільш важливим відносять:

  • Таблицю розподілу пам'яті
  • Поточний статус (неактивний, призупинено, виконується і т.п.)
  • пріоритет
  • Інформацію про необхідні ресурсах
  • Інформацію про файлах і мережевих портах, відкритих процесом
  • Маску сигналів (запис про те, які сигнали блокуються)
  • Ім'я власника процесу

Потік виконання, зазвичай іменується просто потоком, представляє результат розгалуження у виконанні процесу. Потік успадковує багато атрибутів свого процесу, причому в рамках одного процесу можуть виконуватися одночасно (паралельно) кілька потоків - така модель виконання отримала назву многопоточности. У старих однопроцесорних системах паралельне виконання моделюється ядром, але в мультиядерних і багатопроцесорних архітектур потоки можуть виконуватися одночасно в різних ядрах. Такі багатопотокові програми, як BIND і Apache, отримують максимальну користь з мультиядерних систем, оскільки ці програми можуть обробляти декілька запитів одночасно.

атрибути процесу

Ядро призначає кожному процесу унікальний ідентифікатор PID. PID - Proccess ID. Більшість команд і системних викликів, які працюють з процесами, вимагають вказівки конкретного ідентифікатора, щоб був зрозумілий контекст операції. Ідентифікатори присвоюються по порядку в міру створення процесів.

Ні в UNIX, ні в Linux немає системного виклику, який би ініціював новий процес для виконання конкретної програми. Для того, щоб породити новий процес, існуючий процес повинен клонувати себе сам. Клон може замінити виконувану програму іншого.

В операції клонування вихідний процес називають батьківським, а його клон - дочірнім. Крім власного ідентифікатора, кожен дочірній процес має атрибут PPID (Parent Proccess ID), який збігається з ідентифікатором породив його дочірнього процесу. Варто відзначити, що PPID - вельми корисна інформація, якщо доводиться мати справу з невідомими процесами. Відстеження витоків процесу може полегшити розуміння його призначення і значимості.

Коли система завантажується, ядро ​​самостійно запускає кілька процесів. Найбільш важливий з них - демон init. ідентифікатор якого завжди дорівнює 1. Демон init відповідає за виконання сценаріїв запуску системи. Все процесу, крім тих, що створюються ядром, є нащадками демона init.

UID (User ID) - це ідентифікатор користувача, який створив цей процес. Міняти атрибути процесу можуть тільки його творець (власник) і привілейований користувач. EUID (Effective User ID) - це поточний користувальницький ідентифікатор процесу, призначений для того, щоб визначити, до яких ресурсів і файлів у процесу є доступ в даний момент. У більшості програм значення UID і EUID однакові. Виняток становлять програми, у яких встановлено біт зміни ідентифікатора користувача (setuid).

GID (Group ID) - це ідентифікатор групи, до якого належить власник процесу. Поточний ідентифікатор групи (EGID) пов'язаний з атрибутом GID так само, як і значення EUID пов'язано з UID.

Пріоритет процесу визначає, яку частку часу центрального процесора отримує програма. Ядро застосовує динамічний алгоритм обчислення пріоритетів, що враховує скільки часу центрального процесора вже використовував процес і скільки часу він очікує в своєї черги.

Життєвий цикл процесу

Створення процесу - це перехід процесу зі стану «Новий» у стан «Готовий». У момент створення процесу операційна система готує структуру даних для нього. Новому процесу присвоюється власний PID, і облік ресурсів ведеться незалежно від предка. Той факт, що процес існує - ще не дає йому права на використання ресурсів центрального процесора.

Управління процесами в linux

Готовий процес отримав всі необхідні ресурси і чекає, поки системний планувальник надасть йому доступ до центрального процесора. При виділенні доступу процес запускається і переходить в активний стан (виконується).

Зі стану «Запущено» є два шляхи:

  1. Таймаут - процес попрацював і звільнив ресурси процесора (перейшов в чергу)
  2. Очікування - процес переведений в режим очікування, де чекає якогось сигналу

Якщо процес здійснив системної виклик, який не можна завершити негайно, то ядро ​​переводить його в режим очікування (сон). Дзвінок процес чекає настання певної події, будь то надходження даних з терміналу або з мережевого з'єднання. Багато системні демони проводять в цьому стані більшу частину свого часу. Важливо відзначити, що в даному випадку процес буде продовжувати зберігатися в оперативній пам'яті.

Деякі операції переводять процес в стан безперервного очікування (припинений). В даному стані процес очікує певного сигналу від апаратної частини і не реагує на інші сигнали. При цьому процес вивантажено з оперативної пам'яті на жорсткий диск (swap-розділ). Для того, щоб позбутися від такого процесу необхідно усунути породила їх проблему або перезавантажити систему.

Після того як процес завершився - він знищується.

Зомбі - це процес, який закінчив виконуватися, але інформація про це ще не надійшла батьківського процесу. Процес при завершенні вивільняє всі свої ресурси (за винятком PID) і стає «зомбі» - порожній записом в таблиці процесів, який зберігає код завершення для батьківського процесу.

Управління процесами в linux

Всі процеси шикуються в чергу на виконання команд. При цьому існує кілька черг в залежності від статусу процесу: черга готових і чергу заблокованих. Після закінчення роботи процес переходить в початок чергу і знову чекає свого моменту для доступу до ресурсів центрального процесора.

Управління процесами в linux

Робота з процесами в Linux

user @ ubuntu $ ps aux

Ключ a використовується для виведення всіх процесів, ключ x - відображає процеси, від'єднані від терміналу, ключ u - забезпечує фільтрування по імені або код користувача, який запустив програму.

Управління процесами в linux

Значення стовпців при виведенні команди ps aux:

  1. USER - ім'я власника процесу
  2. PID - ідентифікатор процесу
  3. % CPU - частка часу центрального процесора, яка витрачається на даний процес (у відсотках)
  4. % MEM - частина реальної пам'яті, яка витрачається на даний процес (у відсотках)
  5. VSZ - віртуальний розмір процесу
  6. RSS - кількість сторінок пам'яті
  7. TTY - ідентифікатор керуючого терміналу
  8. STAT - поточний статус процесу (R-виконується, D-очікує записи на диск, S-неактивний, T-призупинений, Z-зомбі)
  9. TIME - кількість часу центрального процесора, витрачений на виконання даного процесу
  10. COMMAND - ім'я та аргументи команди

Нижче в скороченому вигляді показані результати роботи команди ps lax. Зверніть увагу на додаткові поля PPID (ідентифікатор батьківського процесу), NI (фактор поступливості), WCHAN (ресурс, якого очікує процес).

Управління процесами в linux

NI по суті відображає пріоритет процесу. Чим нижче значення - тим пріоритетною він буде виконуватися процесором. Значення варіюються від -20 до 20.

Дуже зручно шукати ідентифікатор процесу за допомогою зв'язки команд ps і grep. PS виводить список процесів, після чого передає управління команді grep, яка в свою чергу виділяє зі списку шуканий процес. Приклад: знайдемо PID для процесу cron.


Як видно PID для процесу cron дорівнює 879.

Команда ps дозволяє зробити тільки разовий «знімок» системи. Для динамічного відстеження процесів використовують команду top.

Управління процесами в linux

Найбільш активні процеси знаходяться вгорі. Команда top відображає також статистику по статусах процесів, обсяг використовуваних ресурсів ЦПУ і оперативної пам'яті.

Сигнали - це запити на переривання, що реалізуються на рівні процесів.

Коли надходить сигнал, можливий один з двох варіантів подій. Якщо процес призначив сигналу підпрограму обробки, то після виклику їй надається інформація про контекст, в якому був згенерований сигнал. В іншому випадку ядро ​​виконує від імені процесу дії, задані за замовчуванням. Ці дії залежать від сигналу, а в деяких випадках ще створюється дамп пам'яті.

Дамп пам'яті - це файл, який містить образ пам'яті процесу

Процедура виклику обробника називається перехопленням сигналу. Коли виконання обробника завершується, процес поновлюється з тієї точки, де був отриманий сигнал.

Для того, щоб деякі сигнали не надходили в програму можна задати їх ігнорування і блокування. Ігнорований сигнал просто пропускається і не впливає на роботу процесора. Блокується сигнал ставиться в чергу на обробку, але ядро ​​не вимагає від процесу ніяких дій до явного розблокування сигналу.

Визначено понад тридцять різних сигналів, і вони знаходять саме різне застосування. Найпоширеніші з них:

  1. KILL - безумовне завершення процесу на рівні ядра
  2. STOP - призупиняє виконання процесу
  3. CONT - відновлює виконання процесу
  4. TSTP - генерується при натисканні CTRL + Z, призупиняє процес користувачем
  5. TERM - запит на завершення програми (процес здійснює очищення і нормально завершується)
  6. QUIT - те ж саме, що і TERM + створюється дамп пам'яті
  7. HUP - команда скидання
  8. BUS - помилка на шині (вказує на неправильне звернення до пам'яті)
  9. SEGV - помилка на сегментації (вказує на неправильне звернення до пам'яті)

Сигнали KILL і STOP можна ні перехопити, ні заблокувати, ні проігнорувати.

Команда kill використовується для відправки сигналів процесу. Kill повинен виглядати так:

user @ ubuntu $ kill [-сигнал] PID

Для прикладу знищимо процес cron. Раніше ми з'ясували, що його PID = 879.

user @ ubuntu $ kill -KILL 879

Як бачимо процес cron прибраний. Сигнали типу kill треба посилати з правами суперкористувача. Також перед тим, як вбивати cron я прибрав рядок respawn в файлі конфігурації cron.conf, який знаходиться в папці /etc/init/cron.conf.

Наостанок розповім про ще одну цікаву річ. Upstart - це система ініціалізації ОС, яка управляє запуском демонів протягом завантаження системі. Зберігаються конфігураційні файли Upstart в папці / etc / init. Існує кілька команд для роботи з Upstart.

user @ ubuntu $ status [ім'я процесу] - статус процесу

user @ ubuntu $ start [ім'я процесу] - запуск процесу

user @ ubuntu $ stop [ім'я процесу] - зупинка процесу

user @ ubuntu $ restart [ім'я процесу] - рестарт процесу