Монітор (синхронізація)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Монітор реалізується за допомогою м'ютекса та умовних змінних.

Монітор був винайдений П.Б. Хансеном[1] та Тоні Гоаром[2] та вперше був застосований в мові Concurrent Pascal.

М'ютекс

[ред. | ред. код]

Монітор гарантує ексклюзивний доступ до класу, об'єкта чи модуля за допомогою використання м'ютекса.

Приклад об'єкта, що гарантує безпечний доступ до банківського рахунку:

monitor class Account {
  private int balance := 0
  invariant balance >= 0

  public method boolean withdraw(int amount)
     precondition amount >= 0
  {
    if balance < amount then return false
    else { balance := balance - amount ; return true }
  }

  public method deposit(int amount)
     precondition amount >= 0
  {
    balance := balance + amount
  }
}

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

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

Умовні змінні

[ред. | ред. код]

Якщо метод монітора має дочекатись деякої умови, що встановлюється методом того самого монітора в іншому потоці, то цей метод повинен:

  1. тимчасово звільнити м'ютекс та очікувати (призупинити своє виконання),
  2. після зміни умови отримати м'ютекс назад та бути оповіщеним (пробудженим).

Така функціональність реалізується за допомогою змінних умови (умовна змінна).

Технічно, умовна змінна є списком потоків, що очікують на дану умову. Поки потік очікує на умовну змінну, він не може зайняти монітор.

Єдиними операціями можливими над умовною змінною є: очікування та оповіщення.

Блокуюча умовна змінна — рання реалізація (реалізація Гоара), що при оповіщенні умовної змінної, негайно активізує потік очікування та віддає йому м'ютекс. Ця реалізація технічно складна, і її єдина перевага в тому, що оповіщений потік може бути впевненим, що умова ще чинна.

Неблокуюча умовна змінна — пізніша реалізація (реалізація Mesa) дозволяє потоку, що сповіщає завершити метод монітора, а аж потім пробудити потік очікування. Це реалізація простіша, але вона не гарантує чинності умови в момент пробудження потоку, оскільки умова могла після першої зміни знову змінитись. Тому, в коді очікування потрібно писати while test do wait(cv) замість if test then wait(cv).

Поширення

[ред. | ред. код]

Монітори підтримують мови програмування:

Примітки

[ред. | ред. код]
  1. Brinch Hansen, Per (1973). 7.2 Class Concept. Operating System Principles. Prentice Hall. ISBN 0-13-637843-9.
  2. Hoare, C. A. R. (October 1974). Monitors: an operating system structuring concept. Comm. ACM. 17 (10): 549—557. doi:10.1145/355620.361161.

Посилання

[ред. | ред. код]