Мониторы Хоара

Рис. 5.1. Реализация взаимного исключения в операционной системе Windows NT

Необходимо иметь понятные, очевидные решения, которые позволят прикладным программистам без лишних усилий, связанных с доказательством правильности алгоритмов и отслеживанием большого числа взаимосвязанных объектов создавать параллельные взаимодействующие программы.

К таким решениям можно отнести так называемые мониторы, предложенные Хоаром.

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

Каждый раз, когда процесс желает получить в свое распоряжение какие-то ресурсы, он должен обратиться к монитору.

Этот монитор должен иметь переменные, с помощью которых он отслеживает, занят ресурс или свободен.

Монитор разделяют все процессы, и каждый процесс может в любой момент захотеть обратиться к монитору.

Таким образом, монитор - это механизм организации-параллелизма, который содержит как данные, так и процедуры, необходимые для реализации динамического распределения конкретного общего ресурса или группы общих ресурсов.

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

При входе в монитор осуществляется взаимоисключение процессов, так что в каждый момент времени только одному процессу разрешается войти в монитор.

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

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

Внутренние данные монитора могут быть либо глобальными (относящимися ко всем процедурам монитора), либо локальными (относящимися только к одной конкретной процедуре).

Ко всем этим данным можно обращаться только изнутри монитора; процессы, находящиеся вне монитора и, по существу, только вызывающие его процедуры, просто не могут получить доступ к данным монитора.

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

Если процесс обращается к некоторой процедуре монитора и обнаруживается, что соответствующий ресурс уже занят, то процесс переводится в режим ожидания того момента, когда необходимый ему ресурс освободится.

Со временем процесс, который занимал данный ресурс, обратится к монитору, чтобы возвратить ресурс системе. Соответствующая процедура монитора при этом принимает уведомление о возвращении ресурса, а затем ждёт, пока не поступит запрос от другого процесса, которому потребуется этот ресурс. Если есть процессы, ожидающие данный ресурс, то один из них получает данный ресурс и покидает монитор.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: