Спонсор: Microsoft
Опубликован: 13.11.2010 | Уровень: для всех | Доступ: свободно | ВУЗ: Санкт-Петербургский государственный университет
Лекция 12:

Методы синхронизации процессов

Мониторы

Конструкция монитор предложена в 1974 г. Ч. Хоаром [ 18 ] . Она является более высокоуровневой и более надежной конструкцией для синхронизации, чем семафоры.

Описание монитора имеет вид:

monitor monitor-name

{

	описания общих переменных

	procedure body P1 ( … ) {

		. . . 

	}

	procedure body P2 ( … ) {

		. . . 

	}

	. . .

	procedure body Pn( … ) {

		. . . 

	}

	{

		код инициализации монитора

	}

}

Монитор является многовходовым модулем особого рода. Он содержит описания общих для нескольких параллельных процессов данных и операций над этими данными в виде процедур P1, …, Pn. Пользователи монитора – параллельные процессы – имеют доступ к описанным в нем общим данным только через его операции, причем в каждый момент времени не более чем один процесс может выполнять какую-либо операцию монитора; остальные процессы, желающие выполнить операцию монитора, должны ждать, пока первый процесс закончит выполнять мониторную операцию.

По сути дела, концепция монитора явилась развитием предложенной также Ч. Хоаром концепции абстрактного типа данных (АТД) – определения типа данных как совокупности описания его конкретного представления и абстрактных операций над ним (в виде процедур). Концепция монитора добавляет к АТД возможность синхронизации процессов по общим данным.

Для реализации ожидания внутри монитора по различным условиям, вводятся условные переменные (condition variables) – переменные с описаниями вида condition x,y, доступ к которым возможен только операциями wait и signal: например, x.wait(); x.signal(). Операция x.wait() означает, что выполнивший ее процесс задерживается до того момента, пока другой процесс не выполнит операцию x.signal(). Операция x.signal() возобновляет ровно один приостановленный процесс. Если приостановленных процессов нет, она не выполняет никаких действий.

Схематическое изображение монитора приведено на рис. 12.2.

Схематическое изображение монитора.

Рис. 12.2. Схематическое изображение монитора.

Схема монитора с условными переменными приведена на рис. 12.3.

Монитор с условными переменными.

увеличить изображение
Рис. 12.3. Монитор с условными переменными.

Решение задачи "обедающие философы" с помощью мониторов

Реализуем решение задачи "обедающие философы" (см. Решение с помощью семафоров задачи "обедающие философы") с помощью монитора. Для каждого философа определим состояния (голодный, обедает, думает), и для их хранения будем использовать массив state. Для управления переходом философа из состояния в состояние используем массив условных переменных self. Для каждого философа определим операции pickup – взять палочку; putdown – освободить палочку ; test – проверить состояние философа и, если это возможно и если он голоден, перевести его в состояние eating.

Код монитора, реализующего решение задачи:

monitor dp

{

	enum {thinking, hungry, eating} state [5];

	condition self [5];

	void pickup (int i) {

		state [i] = hungry;

		test (i);

		if (state[i] != eating) {

			self[i].wait ();

		}

	} /* pickup */

	void putdown (int i) {

		state [i] = thinking;

		test ((i+4) % 5));

		test ((i-1) % 5));

		/* когда палочка свободна, проверить соседей */

	} /* putdown */

	void test (int i) {

		if (state((i+4)%5) != eating &&

 state [i] = hungry &&

 		 state((i+1)%5) != eating)) {

			state[i] = eating;

			self[i].signal;

 

	void init () {

		for (int i = 0; i < 5; i++) {

			state[i] = thinking;

	}

}
Гульжан Мурсакимова
Гульжан Мурсакимова
Василий Четвертаков
Василий Четвертаков