1. Мониторы Хоара. Команды Wait() и Signal(). Монитор, реализующий двоичный семафор
2. Почтовые ящики
3. Конвейеры (программные каналы)
4. Очереди сообщений
Мониторы
Средства синхронизации параллельных процессов более высокого уровня были первоначально предложены в работах Дейкстра и Хоара.
Монитор (monitor) — это набор процедур и информационных структур, которым процессы пользуются в режиме разделения, причем в каждый момент им может пользоваться только один процесс.
Например, рассмотрим некоторый ресурс, который разделяется между процессами каким-либо планировщиком. Каждый раз, когда процесс желает получить в свое распоряжение какие-то ресурсы, он должен обратиться к программе-планировщику. Этот планировщик должен иметь переменные, с помощью которых он отслеживает, занят или свободен ресурс. Процедуру планировщика разделяют все процессы, и каждый процесс может в любой момент захотеть обратиться к планировщику. Но планировщик не в состоянии обслуживать более одного процесса одновременно. Такая процедура представляет собой пример монитора. Т.е. монитор можно представить себе как комнату, от которой есть только один ключ, причем этим ключом процессы могут воспользоваться только по очереди.
Вход в монитор находится под жестким контролем — здесь осуществляется взаимоисключение процессов, так что в каждый момент времени только одному процессу разрешается войти в монитор. Процессам, которые хотят войти в монитор, когда он уже занят, приходится ждать, причем режимом ожидания управляет сам монитор.
Внутренние данные монитора могут быть либо глобальными, относящимися ко всем процедурам монитора, либо локальными, относящимися только к одной процедуре монитора. Ко всем этим данным можно обращаться только изнутри монитора; процессы, находящиеся вне монитора просто не могут получить доступа к данным монитора. Принимая такое структурное решение, значительно упрощающее разработку программных систем повышенной надежности, говорят, что информация спрятана (information hiding).
Команды Wait () и Signal ().
Если процесс обращается к некоторой процедуре монитора, но соответствующий ресурс занят, эта процедура выдает команду ожидания Wait. Когда монитор блокирует процесс с помощью команды Wait, он должен указать условие, при котором процесс может возобновить свою работу. Когда это условие будет выполнено, монитор выработает команду оповещения Signal, объявляющую о том, что данный ресурс освободился. Если какие-либо процессы ожидают выполнения этого условия, то один из них пробуждается и получает разрешение продолжить работу. Учитывая вышесказанное, команды ожидания и оповещения могут быть записаны следующим образом
