Монітор

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

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

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

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

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

Фактично у процесів може виникнути необхідність очікувати звільнення ресурсу поза монітором з багатьох причин. Тому вводиться поняття змінна-умова. Для кожної з причин, за якою процес переводиться в стан очікування, призначається своя умова. У зв’язку з цим команди Wait та Signal модифікуються на Wait(ім’я_умови) та Signal(ім’я_умови).

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

 

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

Монітор:

 

monitor Розподілу_ресурсів;

var ресурс_зайнято : логічний;

ресурс_звільнено : логічний; {умова}

 

procedure Захопити_ресурс;