Процеси в linux

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

Термін "процес" вперше з'явився при розробці операційної системи Multix і має кілька визначень, які використовуються в залежності від контексту. Процес - це:
  1. програма на стадії виконання
  2. "Об'єкт", яким виділено процесорний час
  3. асинхронна робота
Для опису станів процесів використовується кілька моделей. Найпростіша модель - це модель трьох станів. Модель складається з:
  1. стану виконання
  2. стану очікування
  3. стану готовності

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

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

Готовність - це теж пасивний стан, процес теж заблокований, але на відміну від стану очікування, він заблокована не через внутрішні причини (адже очікування введення даних - це внутрішня, "особиста" проблема процесу - він може ж і не очікувати введення даних і вільно виконуватися - ніхто йому не заважає), а за зовнішніми, що не залежать від процесу, причин. Коли процес може перейти в стан готовності? Припустимо, що наш процес виконувався до введення даних. До цього моменту він був у стані виконання, потім перейшов в стан очікування - йому потрібно почекати, поки ми введемо потрібну для роботи процесу інформацію. Потім процес хотів уже перейти в стан виконання, так як всі необхідні йому дані вже введені, але не тут-то було: так як він не єдиний процес в системі, поки він був у стані очікування, його "місце під сонцем" зайнято - процесор виконує інший процес. Тоді нашого процесу нічого не залишається як перейти в стан готовності: чекати йому нічого, а виконуватися він теж не може.

Зі стану готовності процес може перейти тільки в стан виконання. У стані виконання може знаходиться тільки один процес на один процесор. Якщо у вас n-процесорна машина, у вас одночасно в стані виконання можуть бути n процесів.

Зі стану виконання процес може перейти або в стан очікування або стан готовності. Чому процес може виявитися в стані очікування, ми вже знаємо - йому просто потрібні додаткові дані або він очікує звільнення якого-небудь ресурсу, наприклад, пристрої або файлу. У стан готовності процес може перейти, якщо під час його виконання, квант часу виконання "вийшов". Іншими словами, в операційній системі є спеціальна програма - планувальник, яка стежить за тим, щоб всі процеси виконувалися відведений їм час. Наприклад, у нас є три процесу. Один з них знаходиться в стані виконання. Два інших - в стані готовності. Планувальник стежить за часом виконання першого процесу, якщо "час вийшло", планувальник переводить процес 1 в стан готовності, а процес 2 - в стан виконання. Потім, коли, час відведений, на виконання процесу 2, закінчиться, процес 2 перейде в стан готовності, а процес 3 - в стан виконання.

Діаграма моделі трьох станів представлена ​​на малюнку 1.

Більш складна модель - це модель, що складається з п'яти станів. У цій моделі з'явилося два додаткових стану: народження процесу і смерть процесу. Народження процесу - це пасивний стан, коли самого процесу ще немає, але вже готова структура для появи процесу. Як говориться в афоризмі: "Мало знайти хороше місце, треба його ще застовпити", так ось під час народження якраз і відбувається "застолбленних" цього місця. Смерть процесу - самого процесу вже немає, але може статися, що його "місце", тобто структура, залишилася в списку процесів. Такі процеси називаються зобмі і про них ми ще поговоримо в цій статті.

Діаграма моделі п'яти станів представлена ​​на малюнку 2.

Над процесами можна проводити наступні операції:
  1. Створення процесу - це перехід зі стану народження в стан готовності
  2. Знищення процесу - це перехід зі стану виконання в стан смерті
  3. Відновлення процесу - перехід зі стану готовності в стан виконання
  4. Зміна пріоритету процесу - перехід з виконання в готовність
  5. Блокування процесу - перехід в стан очікування зі стану виконання
  6. Пробудження процесу - перехід зі стану очікування в стан готовності
  7. Запуск процесу (або його вибір) - перехід зі стану готовності в стан виконання
Для створення процесу операційній системі потрібно:
  1. Присвоїти процесу ім'я
  2. Додати інформацію про процес в список процесів
  3. Визначити пріоритет процесу
  4. Сформувати блок управління процесом
  5. Надати процесу потрібні йому ресурси

Процеси створюють ієрархію у вигляді дерева. "Найголовнішим" предком, тобто процесом, що стоять на вершині цього дерева, є процес init (PID = 1).

На мій погляд, наведеної теорії цілком достатньо, щоб перейти до практики, а саме - "помацати" все стану процесів. Звичайно, ми не розглянули системні виклики fork (), exec (), exit (), kill () і багато інших, але в Мережі предостатньо інформації про це. Тим більше, що про ці виклики ви можете прочитати в довідковій системі Linux, ввівши команду man fork. Правда, там написано на всіма улюбленому English, так що за перекладом (якщо він вам потрібен) все-таки доведеться звернутися за допомогою до WWW.

Для спостереження за процесами ми будемо використовувати програму top.

Повне виведення програми я зі зрозумілих причин урізав. Розглянемо по порядку весь висновок програми. У першому рядку програма повідомляє поточний час, час роботи системи (58 min), кількість зареєстрованих (login) користувачів (4 users), загальна середня завантаження системи (load average).

Примітка. Загальною середньою завантаженням системи називається середнє число процесів, що знаходяться в стані виконання (R) або в стані очікування (D). Загальна середнє завантаження вимірюється кожні 1, 5 і 15 хвилин.

У другому рядку виведення програми top повідомляється, що в списку процесів знаходяться 52 процесу, з них 51 спить (стан готовності або очікування), 1 виконується (у мене тільки 1 процесор), 0 процесів зомбі і 0 зупинених процесів.

У третій-п'ятій рядках наводиться інформація про завантаження процесора, використання пам'яті і файлу підкачки. Нас ця інформація не дуже цікавить, тому переходимо відразу до таблиці процесів.

У таблиці відображається різна інформація про процес. Нас зараз цікавлять колонки PID (ідентифікатор процесу), USER (користувач, який запустив процес), STAT (стан процесу) і COMMAND (команда, яка була введена для запуску процесу).

Колонка STAT може містити наступні значення:
    R - процес виконується або готовий до виконання (стан готовності)
  • D - процес в "безпробудному сні" - очікує дискового введення / виводу
  • T - процес зупинений (stopped) або трасується отладчиком
  • S - процес в стані очікування (sleeping)
  • Z - процес-зобмі
  • lt - процес з від'ємним значенням nice
  • N - процес з позитивним значенням nice (про команду nice ми поговоримо пізніше)

Зробіть цей файл виконуваним chmod + x ./process і запустіть його ./process. Тепер перейдіть на іншу консоль (ALT + Fn) і введіть команду ps -a | grep process. Ви побачите наступний висновок команди ps:

Даний висновок означає, що нашого процесу присвоєно ідентифікатор процесу 4035. Тепер введіть команду top -p 4035

Зверніть увагу на колонку стану нашого процесу. Вона містить значення R, яке означає, що в даний момент виконується процес з номером 4035.

Тепер припинимо наш процес - стан T. Перейдіть на консоль, на якій запущений ./process і натисніть Ctrl + Z. Ви побачите повідомлення Stopped.

Тепер спробуємо "приспати" наш процес. Для цього потрібно спочатку "вбити" його: kill 4035. Потім додати перед циклом while в сценарії ./process рядок sleep 10m, яка означає, що процес буде спати 10 хвилин. Після цього знову запустіть команду ps -a | grep process, щоб дізнатися PID процесу, а потім - команду top -p PID. Ви побачите в колонці стану букву S, що означає, що процес знаходиться в стані очікування або готовності - просто кажучи "спить".

Для компіляції даної програми нам потрібен компілятор gcc:

Для тих, у кого не встановлено компілятор, скомпільована програма доступна звідси.

Після того, як програма буде відкомпільована, запустіть її: ./zombie. Програма виведе наступну інформацію:

Запам'ятайте останній номер і швидко переключатися на іншу консоль. Потім введіть команду top -p тисячу сто сорок вісім

Ми бачимо, що в списку процесів з'явився 1 зомбі (STAT = Z), який проживе аж 10 секунд.

Ми вже розглянули всі можливі стану процесів. Залишилося тільки розглянути команду для підвищення пріоритету процесу - це команда nice. Підвищити пріоритет команди може тільки користувач root, вказавши відповідний коефіцієнт зниження. Для збільшення пріоритету потрібно вказати негативний коефіцієнт, наприклад, nice -5 process