Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект ос 2013-5.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
207.36 Кб
Скачать

3 Квазіпаралельне виконання процесів

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

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

Важливо відмітити, що для більшості завдань взаємодії процесів немає різниці, якого роду паралельність використовується в цій ОС. Взагалі, основні проблеми управління процесами можна розбити на два рівні:

  • проблеми коректної і ефективної реалізації паралельного(тобто зазвичай квазіпаралельного) виконання процесів - це проблеми нижнього рівня;

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

Таке розбиття полегшує проектування і відладку систем, а також дозволяє краще зрозуміти істоту даних проблем.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мал. 4‑1

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

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

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

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

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

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

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

Яких саме?

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

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

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

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

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

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

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

Лекція № 5

Багатозадачність

План

1 Витісняюча і невитісняюча багатозадачність

2 Дескриптор і контекст процесу

3 Реєнтерабельність системних функцій

4 Дисципліни диспетчеризації і пріоритети процесів

1 Витісняюча і невитісняюча багатозадачність

Усі багатозадачні ОС можна розділити на два класи, що розрізняються по способах організації перемикання процесів.

В системах с невытесняющей диспетчеризацией (non-preemptive multitasking) работа любого процесса может быть прервана только «по инициативе самого процесса», а точнее – только когда процесс вызывает определенные системные функции. К ним относятся, в частности, описанные выше блокирующие функции. Может также иметься функция, специально предназначенная для добровольной уступки процессом очереди на выполнение (Yield). Вызов такой функции не приводит к блокировке, но может привести к вытеснению процесса1. Если работающий процесс не вызывает системных функций, а занимается, например, долгими расчетами, то все остальные процессы вынуждены простаивать. Когда же системная функция, наконец, вызвана, то система, прежде всего, проверяет, может ли эта функция быть выполнена сразу или предполагает ожидание некоторого события (требуемый ресурс может быть занят другим процессом; операция ввода/вывода обычно требует определенного времени на свое выполнение; очередь сообщений, требующих обработки, может быть пуста). Если требуется ожидание, то система блокирует процесс, выбирая какой-либо другой из готовых процессов для выполнения. Не исключена ситуация, когда заблокированными по разным причинам оказываются все пользовательские процессы.

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

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

Та частина ОС, яка за визначеними в системі правилами вибирає, чи слід витіснити поточний процес і який процес повинен стати наступним поточним, називається планувальником(scheduler) або диспетчером процесів.

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

Використання невитісняючої диспетчеризації дозволило розробити досить вражаючі приклади ОС, з яких найбільш відомою є Windows версій 1, 2 і 3. Зазвичай в таких системах велика частина процесів знаходиться в сплячому стані, чекаючи, поки користувач звернеться до відповідного застосування. Для користувача це виглядає абсолютно природно.

Главный недостаток многозадачности невытесняющего типа заключается в том, что любой процесс в принципе имеет возможность полностью и надолго захватить процессор. Это «многозадачность на честном слове», основанная на предположении, что программы всех процессов написаны так, чтобы достаточно часто вызывать блокирующие функции. Даже если программист пишет программу для выполнения сложных многочасовых вычислений, он должен искусственно вставлять в некоторых местах вызов системных функций, передающих управление планировщику. Если же это не сделано, то система фактически теряет многозадачность и будет выполнять один процесс, не реагируя на действия пользователя, до тех пор, пока либо «нахальный» процесс завершится, либо рассвирепевший пользователь снимет его по Ctrl+Alt+Del.

Складнішим і досконалішим типом багатозадачних ОС є системи з витісняючою диспетчеризацією процесів(preemptive multitasking). Їх відмінність полягає в тому, що планувальник вступає в роботу не лише(і не стільки) при виклику системних функцій, але і в наступних двох випадках(чи хоч би в одному з них) :

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

  • коли витікає квант часу, виділений планувальником для поточного процесу.

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

Системи, в яких перепланування процесу виконується після витікання кожного кванта часу, називають системами з квантуванням часу(time slicing). Якщо величина кванта досить мала, то для користувача процес періодичної зміни поточного процесу буде непомітний і створиться враження, що усі активні процеси працюють як би одночасно. З іншого боку, чим менше величини кванта, тим більшу частку процесорного часу займатиме процедура перемикання поточного процесу.

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

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