Мониторы.

Рассмотренный алгоритм Деккера имеет некоторые недостатки. Чтобы от них избавиться создали мониторы.

Хоар 1974 год. Монитор – это механизм организации параллелизма, который содержит как данные, так и процедуры, необходимые для динамического распределения общего ресурса или группы общих ресурсов. Чтобы обеспечить выделение нужного ресурса, процесс должен обратиться к конкретной процедуре монитора. Монитор находится под жестким контролем, здесь осуществляется взаимное исключение, так что в каждый момент времени только одному процессу разрешается войти в монитор. Процессы, которые хотят войти в монитор, переходят в режим ожидания, причем время и режим ожидания определяет сам монитор. Внутренние данные могут быть либо глобальные, либо локальные, но ко всем этим данным можно обращаться только изнутри монитора. Если процесс обращается к монитору за ресурсом, и обнаруживается, что этот ресурс уже занят, то монитор выдает команду WAIT (имя условия). Переменные-условия совсем не похожи на обычные переменные. Если определяется такая переменная, то заводится очередь, в которую включаются ожидающие процессы, причем для каждой отдельно взятой причины назначается собственное имя переменной-условия. Со временем процесс, который занимал данный ресурс, для возврата ресурса обращается к монитору. Если уже имеются процессы, ожидающие ресурса, то монитор применяет примитив SIGNAL (имя условия). В противном случае монитор вносит ресурс в список свободных. Примером монитора является кольцевой буфер – структура данных, широко применяемая в ОС для буферизации обменов между процессом-производителем и процессом-потребителем. Производитель, обнаруживший, что буфер заполнен, вызывает команду ожидания wait (буфер не заполнен). Потребитель, обнаруживший, что буфер пуст, вызывает wait (буфер не пуст). Производитель, помещающий данные в буфер, выдает signal (буфер не пуст). Потребитель, извлекающий данные, выдает signal (буфер не заполнен).