- •Лекция 5 Синхронизация процессов
- •1 Синхронизация процессов с использованием объектов ядра
- •1.1 Объекты «мьютекс»
- •1.2 События
- •1.3 Семафоры
- •1.4 Ждущие таймеры
- •2 Задачи синхронизации.
- •2.1 Задача «производитель-потребитель»
- •2.3 Задача «обедающие философы»
- •3 Мониторы Хоара
- •2.2 Задача «читатели-писатели»
- •Var busy: boolean; {busy - занят}
- •4. Почтовые ящики
- •5 Конвейеры и очереди сообщений
1.4 Ждущие таймеры
Ждущий таймер (waitable timer) представляет собой новый тип объектов синхронизации, поддерживаемый в Windows NT версии 4.0 и выше. Это полноценный объект синхронизации, который может использоваться для организации задержки в одном или нескольких приложениях.
Ждущий таймер работает в трех режимах. В режиме «ручного сброса» таймер переходит в установленное состояние при истечении заданной задержки и остается установленным до тех пор, пока функция SetWaitableTimer не задаст новую задержку. В режиме «автоматического сброса» таймер переходит в установленное состояние при истечении заданной задержки и остается установленным до первого успешного вызова функции ожидания. В этом режиме он напоминает объект Event в режиме автоматического сброса, поскольку каждый раз при истечении времени задержки разрешается выполнение лишь одной нити. Наконец, ждущий таймер может выполнять функции интервального таймера, который перезапускается с заданной задержкой после каждого срабатывания объекта.
Главная особенность, отличающая ждущие таймеры от системных, — то, что ждущие таймеры могут совместно использоваться несколькими приложениями. Например, вы можете приостановить несколько приложений в фоновом режиме так, чтобы они «просыпались» каждые несколько часов для выполнения некоторой операции.
Процессы получают дескрипторы ждущих таймеров так же, как они получают дескрипторы мьютексов: дублированием, наследованием или открытием по имени.
В следующей таблице перечислены функции, предназначенные для работы со ждущими таймерами.
Функция
|
Описание
|
CancelWaitableTimer
СгеаteWaitableTimer
OpenWaitableTirner
SetWaitableTimer
|
Останавливает работу ждущего таймера. Таймер остается в текущем состоянии Создает объект ждущего таймера. Если таймер с заданным именем уже существует, он открывается Открывает существующий ждущий таймер
Запускает ждущий таймер с заданной продолжительностью и интервалом срабатывания
|
2 Задачи синхронизации.
2.1 Задача «производитель-потребитель»
Имеется два типа взаимодействующих процессов с жестко распределенными между ними функциями. Процессы-производители вырабатывают сообщения, предназначенные для восприятия и обработки другими процессами-потребителями. Процессы взаимодействуют через некоторую обобщенную область памяти, которая по смыслу является критическим ресурсом. В эту область процесс-производитель должен поместить очередное сообщение, а процесс-потребитель - считывать очередное сообщение. Необходимо согласовать работу этих процессов по обмену сообщениями таким образом, чтобы выполнялись следующие требования:
- требования задачи взаимного исключения по отношению к критическому ресурсу - обобщенной памяти для хранения сообщения;
- учитывается состояние обобщенной области памяти, характеризующей возможность или невозможность посылки (принятия) очередного сообщения.
Попытка процесса-производителя поместить очередное сообщение в область, из которой не было считано предыдущее сообщение процессом-потребителем, должна быть блокирована. Процесс-потребитель должен быть либо оповещен о невозможности помещения сообщения, либо переведен в состояние ожидания возможности поместить очередное сообщение через некоторое время в область памяти, по мере ее освобождения. Аналогично должна быть заблокирована попытка процесса-потребителя считать сообщение из области в ситуации, когда процесс-производитель не поместил туда очередного сообщения. В этом случае необходимо выдать сообщение о невозможности считывания либо перевести процесс-потребитель в состояние ожидания поступления очередного сообщения. Если используется вариант с ожиданием изменения состояния обобщенной области для хранения сообщений, необходимо обеспечить перевод ожидающих процессов в состояние готовности всякий раз, когда изменится состояние области.
Множественность постановки задачи «производитель-потребитель» определяется тем, что число процессов-потребителей и процессов-производителей может быть больше одного. Каждый из таких процессов может устанавливать не только одностороннюю, но и двухстороннюю связь через одну и ту же обобщенную область или другие области. Области могут хранить большое количество сообщений.
