Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Desktop / For_exams / Smirnov / 1 - копия (29)

.txt
Скачиваний:
33
Добавлен:
27.03.2015
Размер:
3.31 Кб
Скачать
30. Критические секции
Третий механизм синхронизации называется «критическая секция» (critical
section). Он реализует концепцию «критических областей». В Windows он похож
на мьютекс, за исключением того, что он является локальным для адресного
пространства создающего потока. Поскольку критические секции не являются
объектами режима ядра, они не имеют явных описателей или дескрипторов безопасности
и не могут передаваться между процессами. Блокирование и разблокирование
выполняется соответственно вызовами EnterCriticalSection и LeaveCriticalSection.
Поскольку эти функции API выполняются первоначально в пространстве
пользователя и делают вызовы ядра только при необходимости в блокировке, то они гораздо
быстрее мьютексов. Критические секции оптимизированы для комбинированного
использования спин-блокировок (на многопроцессорных системах) и
синхронизации ядра (при необходимости). Во многих приложениях большинство критических
секций так редко становятся объектом соперничества или имеют такое краткое
время удерживания, что необходимость в выделении объекта синхронизации ядра
никогда не возникает. Это приводит к очень существенной экономии памяти ядра.
11.4. Процессы и потоки в Windows Vista 993
Последний из обсуждаемых механизмов синхронизации использует объекты
режима ядра, которые называются событиями (events). Как мы уже описывали
ранее, существует два их вида: события уведомления (notification events) и
события синхронизации (synchronization events). Событие может быть в одном
из двух состояний: сигнализированном или несигнализированном. Поток может
ждать сигнализации события при помощи WaitForSingleObject. Если другой поток
сигнализирует событие при помощи SetEvent, то результат зависит от типа события.
Для события уведомления — будут освобождены все ждущие потоки, а событие
останется установленным до тех пор, пока не будет сброшено вручную при
помощи ResetEvent. Для события синхронизации — если ждет один или несколько
потоков, то освобождается только один поток и событие сбрасывается.
Альтернативная операция — PulseEvent, которая похожа на SetEvent (за исключением того,
что если никто не ждет, то импульс теряется и событие сбрасывается). В отличие
от нее SetEvent (когда оно происходит в отсутствие ожидающих потоков)
запоминается — событие остается в сигнализированном состоянии, так что следующий
поток (который вызывает API для ожидания события) фактически ждать не будет.
Количество вызовов Win32 API для работы с процессами, потоками и
волокнами составляет почти 100 штук, причем большое их количество в той или иной
форме работает с IPC. Сводка по обсуждавшимся выше вызовам (а также
некоторым другим важным вызовам) дана в табл. 11.14.

Обратите внимание, что некоторые из этих вызовов — это не просто системные
вызовы. Некоторые из них являются оболочками, другие содержат значительное
количество библиотечного кода, который отображает семантику Win32 на
собственные вызовы интерфейса NT API. Третьи (относящиеся к интерфейсу волокон)
являются исключительно функциями пользовательского режима, поскольку (как мы
уже упоминали ранее) режим ядра в Windows Vista ничего не знает о волокнах.
Они полностью реализованы средствами библиотек пользовательского режима.
Соседние файлы в папке Smirnov