Средства высокоуровневой синхронизации

 

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

Монитор представляет собой набор процедур, переменных и других структур данных, объединенных в программный модуль, который обеспечивает функциональность, эквивалентную функциональности семафора. Мониторы реализованы во множестве языков программирования, включая Pascal-Plus, Modula-3, Java. Мониторы также реализуются как программные библиотеки. Это позволяет их использовать для блокировки любых объектов.

Основными характеристиками монитора являются следующие характеристики:

1. Локальные переменные монитора доступны только его процедурам и не доступны внешним процедурам;

2. Процесс входит в монитор путем вызова одной из его процедур;

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

Если в монитор поместить совместно используемые структуры данных, то будет обеспечено взаимное исключение при обращении к данным. Для применения в параллельных вычислениях мониторы должны включать инструменты синхронизации. Рассмотрим реализацию мониторов в языке Java. Возможность синхронизации в Java реализована в виде ключевого слова synchronized, указывающего на необходимость получения монопольной блокировки, и трех методов условной синхронизации, wait(), notify(), notifyall(), определенных в классе Object и поэтому наследуемых любым другим классом. В каждый объект Java встроена возможность монопольной блокировки и одна условная переменная. Если объявить метод объекта как synchronized, для его выполнения вызывающему коду необходимо получить монопольную блокировку объекта. У каждого объекта в Java имеется свой собственный неявный монитор. Когда метод типа synchronized вызывается для объекта, происходит обращение к мони-

тору объекта чтобы определить, выполняет ли в данный момент какой-либо другой поток метод типа synchronized для данного объекта. Если нет, то текущий поток получает разрешение войти в монитор. Вход в монитор называется также блокировкой (locking) монитора. Если при этом другой поток уже вошел в монитор, то текущий поток должен ожидать до тех пор, пока другой поток не покинет монитор. Таким образом, монитор Java вводит поочередность в параллельную обработку. Этот способ называется также преобразованием в после-

довательную форму (serialization). Объявление метода synchronized не подразумевает, что только один поток может одновременно выполнять этот метод, как в случае критического участка. В любой момент времени только один поток может вызвать этот метод (или любой другой метод типа synchronized) для конкретного объекта. Таким образом, мониторы Java связаны с объектами, но не с блоками кода. Два потока могут параллельно выполнять один и тот же метод типа synchronized при условии, что этот метод вызван для разных объектов. Мониторы не являются объектами языка Java, у них нет атрибутов или методов. Доступ к мониторам возможен на уровне собственного кода JVM.

Задача о спящем парикмахере

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


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



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