Процеси та їх стани

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

Спочатку трохи теорії...

Єдиного визначення процесу не існує. Можна навести декілька визначень, і вони всі будуть вірними.

Процес

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

Модель трьох (п'яти) станів процесів

Модель 3-5 станів.png

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

Робота даної діаграми

Народжується процес. Потрапляє в стан готовність і в стані готовності знаходиться в черзі готових до виконання процесів доки не дійде до нього черга (як в столовкі в черзі). Потрапляє процес в стан виконання. Тут 3 варіанти:

  • процес виконався повністю, тоді він завершився;
  • якщо процесу чогось не вистачає, процес переводиться в стан чекання;
  • можливий тільки на системах з витісняючою багатозадачністю, коли в списку готових до виконання процесів з'являється процес з вищим пріоритетом.

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

Операції над процесами

  • Допуск до планування (створення процесу)
  • Відправлення на виконання
  • Переривання процесу
  • Завершення процесу
  • Переведення в стан чекання
  • Переведення до стану готовність (відновлення процесу)

Процеси в Linux

Модель станів Linux.png

Чекання, що переривається (S) - це стан блокування, при якому процес чекає події(вводу, виводу, гигналу від іншого процесу)
Чекання, що непериривається (D) - процес беспосередньо чекає виконання якоїсь апаратної умови і тому не сприймає ніякі інші сигнали.
Призупинення (T) - процес був зупинений і може бути продовжений тільки при дії іншого процесу.
Зомбі (Z) - процес було припинено, але за деяких обставин його структура залишилася в таблиці процесів.
Визначення станів Готовність та Виконання (R) такі ж, як і в попередній моделі!

Створення процесу в Linux

Використовуємо системну функцію fork(0).

  1. В таблиці процесів виділяється місце для нового процесу
  2. Цьому процесу назначається унікальний ідентифікатор
  3. Створюється копія образа батьківського процесу
  4. Збільшується значення лічильників всіх файлів, що належать батьківському процесу, тобто новий процес токаж є власником цих файлів
  5. Повернення батьківському процесу ідентифікатора молодшого процесу, а молодшому значення 0, fork(0).

Пошук процесів в системі

Тепер перейдемо до практики. Нам потрібно знайти 5 станів в системі Linux. Ну що ж, почнемо.
Найлегше в системі знайти 2 стани: виконання (R) і чекання, що переривається (S). Запускаємо термінал і пишемо команду ps -ax (виведення таблиці процесів).
В третій колонці ми бачимо потрібні нам стани. Процес R and S.png


Щоб знайти ще 3 стан, доведеться попрацювати. Призупинений процес - T отримати найлегше. Для цього відкриваємо Системный монитор(натискаємо на значок Ubuntu і вводимо "Системный монитор") переходимо на вкладку Процесы - ПКМ на якомусь процесі і вибираємо пункт Остановить(для того, щоб бачити в якому стані знаходиться процес, натискаємо зверху Правка->Параметры->ставимо галочку на Состояние). Виконуємо ps -ax і бачимо серед процесів новий T - призупинений.
Стан Т.png


Процес D - чекання, що не переривається отримати можна забивши оперативну пам’ять(Наприклад відкрити ресурсоємкі програми на зразок браузера, або відкрити флешку і почати з неї щось копіювати). Стан Д.png


Ну і найцікавіший процес Z - Зомбі отримати найважче напевне. Можна, звичайно, поставити собі компілятор на Сі, і скомпілювати дану програмку

                                               #include <stdlib.h>
                                               #include <sys/types.h>
                                               #include <unistd.h>
                                               int main ()
                                               {
                                                 pid_t child_pid;
                                                 child_pid = fork ();
                                                 if (child_pid > 0) {
                                                   sleep (60);
                                                 }
                                                 else {
                                                   exit (0);
                                                 }
                                                 return 0;
                                               }

А можна просто поназапускати багато програм, потім позакривати їх, перевірити в таблиці, чи не з’явився потрібний стан. Якщо не з’явився, то повторити дію ще раз. Думаю, максимум, 3 рази і стан повинен з’явитися.