Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Организация взаимодействия процессов и потоков в Win32



Средства синхронизации Windows NT реализованы в виде объектов синхронизации четырех основных типов:

– Mutex,

– Семафор,

– Событие,

– Критическая секция.

Объекты взаимного исключения Mutex (Mutual Exclusion) могут иметь сигнализирующее (когда они принадлежат процессу) и не сигнализирующее (не принадлежат, свободны) состояние. Эти объекты допускают запрос и отмену доступа к определенному ресурсу нескольких нитей. Если при запросе ресурс доступен (никому не принадлежит), то право владения им будет предоставляться запросившей его нити. Если же ресурс кому-то уже принадлежит, то поток будет ожидать в течение какого-то интервала времени его освобождения или выполняет неопределенный блок.

Эти объекты создаются с помощью вызова CreateMutex и открываются для использования другими нитями с помощью OpenMutex.

Для запроса на доступ к объектам применяются вызовы RequestMutex, а для освобождения - ReleaseMutex (это аналоги P() и V() соответственно). Может быть использована также “универсальная” функция WaitForSingleObject.

Для закрытия доступа к объектам данного типа служит также как и для других типов объектов функция CloseHandle.

Семафорные объекты обладают большей гибкостью.

Семафорные объекты могут быть именованными и неименованными. При использовании именованного семафора доступ к нему основывается на имени. Если применяются неименованные семафоры, то использующие их объекты и потоки должны получить описатели.

Эти объекты фактически представляют собой считающие семафоры с заданным диапазоном значений.

Операция ожидания допускает организацию ожидания на одном или нескольких семафорах.

Для создания контекста семафора служит функция CreateSemaphore. Создаваемый объект является объектом ядра, следовательно, для него можно указать атрибуты защиты для ограничения доступа к нему.

Для открытия доступа к уже созданному семафору в других потоках или процессах используется функция OpenSemaphore.

Для ожидания на семафоре, как и на других объектах, используется функция WaitForSingleObject. Для сигнализации об освобождении семафора вызывается функция ReleaseSemaphore, причем при вызове можно указать величину, на которую должно измениться значение семафора.

Для закрытия и освобождения объекта служит функция CloseHandle.

Для ожидания сразу на нескольких объектах используется функция WaitForMultipleObjects, которой в качестве параметров можно передать целый массив описателей объектов, а также их количество. Ожидание может быть организовано как на всех объектах параллельно, так и на любом объекте, описатель которого находится в массиве.

Кроме того В Windows NT предусмотрен хорошо оптимизированный механизм критической секции.

Объекты критических секций поддерживают упорядоченный доступ к критическим областям. Это наиболее простой способ синхронизации, но он применим только для синхронизации потоков в рамках одного процесса.

Критические разделы позволяют обеспечить монопольный доступ к определенному региону данных (то есть единовременно с этой областью сможет работать только один поток).

Критическая область инициализируется функцией InitialiseCriticalSection. Попытка входа в нее осуществляется через использование EnterCriticalSection. Если критическая секция уже захвачена, то пытающийся войти в нее поток засыпает. Поток. Захвативший критический раздел, может освободить его с помощью функции LeaveCriticalSection. Ее выполнение может разбудить спящий в ожидании входа в критическую секцию поток. Удаление критического раздела осуществляется вызовом DeleteCriticalSection.

В Windows NT предусмотрены также семафоры событий, аналогичные OS/2.

Здесь имеется два класса синхронизирующих событий: события неавтоматического сброса и события автоматического сброса. При сигнализации о свершении события неавтоматического сброса освобождаются все ожидающие его нити, а для установки его состояния в несигнализированное необходим явный вызов соответствующей функции. Если же событие является событием автоматического сброса, то при его свершении освобождается только одна ожидающая его нить и состояние автоматически сбрасывается в несигнализированное.

События, на которых могут ожидать процессы и нити, считаются несигнализированными, а очищаемые события называют сигнализированными.

Для создания события используется функция CreateEvent. События могут быть именованными. При создании указывается также, будет ли созданное событие событием с автоматическим сбросом.

Для организации доступа к уже созданному событию используется OpenEvent.

Функция SetEvent сигнализирует о наступлении события. Указанный в качестве параметра объект устанавливается в сигнализированное состояние. Все ожидающие его потоки перепланируются для выполнения. Чтобы последующие нити ожидали другого события, нужно вызвать ResetEvent для сброса события в несигнализированное состояние. Функция PulseEvent представляет собой комбинацию SetEvent и ResetEvent.

Ожидание можно также организовать с помощью “универсальной” функции WaitForSingleObject.

Закрывается этот объект, как и все объекты, вызовом CloseHandle.

Для организации передачи информации между процессами могут быть организованы каналы. В Windows NT существуют следующие функции для работы с программными каналами:

– создание неименованного программного канала, обеспечивающего одностороннюю передачу данных между процессами, - CreatePipe; после создания канала для записи и чтения данных можно использовать вызовы WriteFile и ReadFile;

– создание на локальной серверной машине именованного программного канала, для которого может быть определен режим передачи информации (канал может быть двунаправленным, может быть предназначен только для передачи информации от клиента к серверу и наоборот), - CreateNamedPipe;

– организация процессом сервера ожидания поступления от процесса-клиента запроса на открытие (CreateFile или CallNamedPipe) - ConnectNamedPipe;

– отключение серверной стороны экземпляра программного канала - DisconnectNamedPipe;

– копирование данных из канала без их удаления - PeekNamedPipe;

– выполнение дискретных операций чтения и записи в режиме передачи сообщений (чтение или запись выполняются как неделимая операция) - TransactNamedPipe;

– организация ожидания, когда серверный процесс вызовет для канала отложенную функцию ConnectNamedPipe, - WaitNamedpipe;

– “универсальная” функция, выполняющая подключение к каналу в режиме сообщения, запись данных из буфера, считывание в буфер, закрытие программного канала, - CallNamedPipe;

– запрос информации о состоянии канала - GetNamedPipeHandleState;

– запрос информации о программном канале - GetNamedPipeInfo;

– изменение информации о состоянии - SetNamedPipe.

Для осуществления коммуникаций между процессами в Windows NT используется еще одно средство - почтовые ячейки, которые представляют собой механизм односторонних коммуникаций (коммуникационный механизм сообщений).

Почтовые ячейки, доступные для клиентов, создает обычно сервер. Сервер отвечает за чтение из почтовых ячеек данных, посылаемых клиентами.

Почтовые ячейки могут использоваться в сети, но при сетевых коммуникациях почтовые ячейки используют датаграммы, следовательно, доставка не гарантируется.

Для создания на серверном компьютере почтовой ячейки используется функция CreateMailSlot. Для запроса информации о почтовой ячейке вызывается GetMailSlotInfo. Функция SetMailSlotInfo позволяет изменить значение тайм-аута, связанного с почтовой ячейкой (этот параметр задает режим ожидания сообщения - возврат управления при отсутствии сообщения или блокировка до прихода сообщения).





Дата публикования: 2014-11-29; Прочитано: 638 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...