При освобождении события со сбросом вручную из состояния ожидания могут выйти одновременно несколько потоков.
Пример. Один поток считывает, другой эти данные обрабатывает.
ResetEvent(…) – переводит в состояние non-signaled.
SetEvent(…) – переводит в свободное состояние signaled.
Поток перед считыванием с помощью функции ResetEvent(…) переводит в занятое состояние, считывает и освобождает с помощью SetEvent(…). Остальные потоки ждут с помощью функции WaitForSingleObject(…).
Освобождаются с помощью SetEvent(…), переходят в занятое состояние с помощью WaitForMultipleObjects(…), как только событие освобождается.
WaitForMultipleObjects(…);
.
.
.
SetEvent(…);
Для событий с автосбросом SetEvent(…) не используется.
Модули – это версия в памяти кода данных и ресурсов исполняемого файла или dll. В каждом процессе имеется модуль для ехе файла, каждая dll – это модуль.
Если два или более процесса обращаются к одной dll они используют один и тот же модуль. Точно также, когда запущены 2 копии процесса, они используют один и тот же модуль.
Информация о модулях хранится в базе данных модуля. В Windows 95, 98, NT база данных модуля фактически представляет собой заголовок исполняемого файла. Любой процесс загружается в ВАП.
начало база данных
ехе файла модуля
При работе с модулями Win32 использует дескриптор модуля HMODULE.
GetModuleHandle(…) – получает дескриптор модуля, виртуальный адрес с которого загружается ехе или dll. Например для всех процессов, работающих под Windows 95, 98 это 00400000h.
База данных модуля находится в адресном пространстве процесса, кроме того, для оператив-ной работы с модулем W32 создаёт копию базы данных своей системной кучи.
1. Проблема защиты информации, то есть создание закрытого адресного пространства для каждого процесса.
2. Для оперативной работы ОС надо знать список всех загруженных модулей.
Эти проблемы решаются с помощью двух структур IMTE (Internal Module Table Entry) и MODREF – она поддерживает собственный список модулей для каждого процесса. И та и другая структуры находятся в системной куче ядра. Рассмотрим структуру IMTE.
таблица модулей IMTE
pModuleTableArray
Начало таблицы модулей хранится в pModuleTableArray. Как только новый процесс или dll создаются, то kernel32 создаёт структуру IMTE, ищет свободный элемент в таблице модулей и записывает в него указатель на структуру IMTE. ОС сама следит за тем, чтобы не произошло заполнение таблицы модулей.