- •Глава 6 Взаимоблокировка и голодание
- •6.1. Принципы взаимного блокирования
- •Повторно используемые ресурсы
- •Расходуемые ресурсы
- •Условия возникновения взаимоблокировок
- •6.2. Предотвращение взаимоблокировок
- •Взаимоисключения
- •Циклическое ожидание
- •6.3. Устранение взаимоблокировок
- •Удержание и ожидание
- •Отсутствие перераспределения
- •Запрещение запуска процесса
- •Запрет выделения ресурса
- •А.) Глобальная структура данных
- •6.4. Обнаружение взаимоблокировок
- •Алгоритм обнаружения взаимоблокировки
- •Восстановление
- •6.5 Интегрированные стратегии разрешения взаимоблокировок
- •6.6. Задача об обедающих философах
- •6.7. Механизмы параллельных вычислений в unix
- •Сообщения
- •Разделяемая память
- •Семафоры
- •Сигналы
- •6.8. Прщийвы синхронизации потоков solaris
- •Блокировки взаимоисключений
- •Семафоры
- •Блокировки читатели/писатель
- •Переменные условий
- •6.9. Механизмы параллельных вычислений в windows 2000
- •6.10. Резюме, ключевые термины и контрольные вопросы
- •Контрольные вопросы
- •6.11. Рекомендуемая литература
- •6.12. Задачи
Переменные условий
Данные переменные используются для ожидания выполнения некоторого условия и должны применяться вместе с блокировками взаимоисключений (тем самым реализуются мониторы, использованные в листинге 5.15). Для работы с ними имеются следующие примитивы.
cv_wait () Блокирование потока до тех пор, пока условие не будет выполнено
cv_signal() Активизация одного из потоков, заблокированных примитивом cv_wait()
cv_broadcast () Активизация всех потоков, заблокированных примитивом cv_wait()
Примитив cv_wait () освобождает связанный с ним мьютекс перед блокированием потока и вновь захватывает его перед завершением работы. Поскольку повторный захват мьютекса может быть заблокирован другим ожидающим потоком, следует повторно проверить выполнение условия, вызвавшего ожидание. Таким образом, типичный фрагмент кода, работающего с переменными условий, выглядит следующим образом:
mutex_enter(&m);
•
•
while(some_condition) {
cv_wait(&cv, &m);
}
•
•
mutex_exit(&m);
Поскольку при таком подходе условие защищено мьютексом, в качестве него может использоваться сложное выражение.
6.9. Механизмы параллельных вычислений в windows 2000
Windows 2000 (W2K) обеспечивает синхронизацию потоков как часть объектной архитектуры. Механизм, использованный W2K для реализации синхронизации, представляет собой семейство следующих объектов синхронизации.
Процесс.
Поток.
Файл.
Консольный ввод.
Уведомление об изменении файлов.
Мьютекс.
Семафор.
Событие.
Таймер ожидания.
Первые четыре объекта в этом списке могут использоваться для целей синхронизации, хотя это и не основное их предназначение. Остальные типы объектов разработаны специально для поддержки синхронизации.
Экземпляр каждого из перечисленных объектов может находиться в одном из двух состояний — сигнальном (signaled) и несигнальном (unsignaled); поток освобождается при входе объекта в сигнальное состояние. Механизм достаточно прост: поток выполняет запрос на ожидание к исполнительной системе W2K с использованием дескриптора объекта синхронизации. Когда объект входит в сигнальное состояние, исполнительная система W2K освобождает все потоки, находящиеся в состоянии ожидания этого объекта.
В табл. 6.2 приведен список событий, приводящих объекты в сигнальное состояние, и указано их влияние на ожидающие потоки.
Таблица 6.2. Объекты синхронизации Windows 2000
Тип объекта Определение Переход в Ожидающие сигнальное потоки состояние Процесс Программа, включая Завершение послед- Освобождаются все адресное пространство него потока потоки и ресурсы, требуемые для ее выполнения
Поток Выполнимая единица Завершение работы Освобождаются все внутри процесса потока потоки
Файл Открытый файл или Завершение опера- Освобождаются все устройство ввода-вывода ции ввода-вывода потоки
Консольный ввод Буфер текстового окна Имеется введенная Освобождается (например, используе- информация, дос- один поток мый для операций вво- тупная процессу да-вывода приложений MS DOS)
Уведомление об Уведомление о любых Изменения в файло- Освобождается изменении файлов изменениях файловой вой системе, соответ- один поток системы ствующие заданному объектом фильтру
Мьютекс Механизм обеспечения Поток освобождает Освобождается взаимоисключений в мьютекс один поток средах Win32 и OS/2
Семафор Счетчик, регулирую- Счетчик семафора Освобождаются все щий количество пото- обнуляется потоки ков, которые могут использовать ресурс |
Событие Извещение о наступ- Поток осуществляет Освобождаются все лении некоторого со- событие потоки бытия в системе
Таймер ожидания Счетчик, учитываю- Наступил указанный Освобождаются все щий прошедшее вре- момент времени или потоки мя истек указанный интервал времени |
Мьютексы используются для взаимоисключительного доступа к ресурсам, благодаря им обеспечивается получение доступа к ресурсу одновременно только одним объектом (т.е., по сути, они выступают в роли бинарного семафора). При входе мьютекса в сигнальное состояние освобождается только один из ожидающих этого потоков. Мьютексы могут также использоваться для синхронизации потоков разных процессов.
Так же как и мьютексы, семафоры могут совместно использоваться потоками разных процессов. В W2K семафоры являются классическими семафорами-счетчиками.
Таймер ожидания — новый объект ядра, появившийся в Windows NT 4.0, который подает сигнал в определенный момент времени и/или через заданные промежутки времени.
