Стану процесу

Будь-який процес у багатозадачного ОС багаторазово відчуває перехід з одного стану в інший.

Основних станів всього три.

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

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

· Блокування або, що те ж саме, сон (sleeping, waiting) - стан, в якому процес не може продовжувати виконання, поки не відбудеться деяке зовнішнє по відношенню до процесу подія.

Перші два стани часто об'єднують поняттям активного стану процесу.

Для станів готовності і сну спільне те, що процес не працює. У чому різниця між цими двома «способами не працювати»?

Готовий до виконання процес не виконується тільки тому, що є інші не менш готові процеси, на думку системи більш гідні займати зараз процесорний час. У кожен момент часу вибір одного з готових процесів на роль працюючого визначається логікою роботи ОС. Цей вибір повинен забезпечувати ефективну квазіпараллельний роботу готових процесів. Як вирішується це завдання - буде розглянуто нижче.

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

Чого він може чекати? Ну, наприклад:

· Завершення розпочатої операції синхронного вводу / виводу (тобто, наприклад, процес чекає натискання клавіші Enter або закінчення запису на диск);

· Звільнення запитаного у системи ресурсу (наприклад, додаткової області пам'яті або відкритого файлу);

· Закінчення заданого інтервалу часу («посплю-но я хвилин десять!») Або досягнення заданого моменту часу («розбудіть мене рівно опівночі!») (В обох випадках процес чекає сигналу від запрограмованого таймера);

· Сигналу на продовження дій від іншого, взаємопов'язаного процесу;

· Повідомлення від системи про необхідність виконати певні дії (наприклад, перемалювати вміст вікна).

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

Чисто умовно можна сказати, що якщо б в обчислювальну систему раптом було додано ще кілька процесорів, то «готові» процеси могли б відразу перейти в стан «робота», але «сплячі» продовжили б свій сон.

Зрозуміло, як ми бачили в п. 2.5, процес може виконувати очікування шляхом циклічної перевірки очікуваного умови. При цьому він формально залишатиметься активним, розтрачуючи дорогоцінний процесорний час на те, що в п. 2.5.2 було названо активним очікуванням. Однак таке рішення буде говорити лише про кричущу некваліфікованості програміста. Будь багатозадачна ОС надає в розпорядження прикладних програм набір функцій, що переводять викликав їх процес в стан сну, в якому процес не намагається використовувати процесорний час (іншими словами, стан сну є стан пасивного очікування). Такі системні функції називаються блокуючими. До їх числа відносяться функції синхронного вводу / виводу, запиту ресурсів, призупинення до заданого часу, отримання повідомлень і багато інших.

Оскільки ОС бере на себе блокування, «усипляння» процесу, вона повинна забезпечити і його розблокування, «пробудження». Щоб це стало можливим, система повинна для кожного сплячого

процесу пам'ятати, «чого він чекає», тобто пам'ятати умови пробудження процесу. Система відслідковує всі події, здатні розблокувати небудь процес (у багатьох випадках використовуючи для цього апаратні переривання) і, коли для одного або відразу декількох процесів настає очікувана подія, переводить ці події зі стану сну в стан готовності.

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

 

Рис. 1‑16

 

Розглянемо можливі переходи між станами процесу, показані на малюнку стрілками.

Перехід Робота à Сон являє собою блокування процесу, яка може відбутися при виклику блокуючої системної функції.

Перехід Сон à Готовність - це пробудження процесу, воно виконується системою при виникненні відповідної умови.

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

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

Відповісти самі на питання: чому «майже завжди», а не «завжди»? Які ще можливі варіанти?

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

Яких саме?

Перехід від готовності до сну неможливий в принципі.

До речі, чому?

Крім трьох основних станів, в різних ОС можуть використовуватися й інші стани.

Стан старту означає, що процес знаходиться на етапі створення і поки не готовий вступити в роботу.

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

Стан призупинення (suspended) означає, що виконання процесу тимчасово перервано оператором (або, може бути, іншим процесом) і пізніше має бути їм же відновлено.

У деяких системах (наприклад, в UNIX) основні стани роздроблені на ряд більш дрібних: робота в системному і в режимі користувача, готовність у пам'яті і готовність на диску і т.п. Необхідний набір станів визначається алгоритмами роботи конкретної ОС.