Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS_l.docx
Скачиваний:
5
Добавлен:
01.12.2018
Размер:
69.76 Кб
Скачать

Объекты синхронизации События

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

Функции для создание таких событий и управлении

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttribute \\ атрибуты безопасности

BOOL bManualReset \\ признак управлении вручную

BOOL bInitialState\\ начальное состояние события

LPCTSTR lpName \\ имя события );

В успешном возвращает дескриптор события , в другом ноль .

Установка свободного текущего состоянии

BOOL SetEvent(HANDLE hEvent\\ дескриптор события);

BOOL ResetEvent(-//-);

Освобождение яда события объекта ядра CloseHADLE.

Алгоритм события ОС например:

Пусть пользовательский поток ожидает пока заданное события перейдет в свободное состояние, при этом в программе используется функция Wait… с дескриптором данного события, ядро изменяет состояние этого события, в состояние ожидание и помещает поток в очередь потоков ожидаемых.

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

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

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

Функция которая открывает Mutex

HANDLE CreateMutex

(

LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибут безопастности

BOOL bInitialOwner, // флаг начального владельца

LPCTSTR lpName // имя объекта

);

Режимы Mutex: если истина то Mutex сразу присвататься состояние занятости, при чем считается занятым потоком который его создал , это имеет смысл когда поток который его создал должен выполняться первым. Что бы Mutex стал занятым используется одна из функций ожидания., которая проверяет его состояние и в определенных случаях устанавливает состояние занятости . значение параметра ложь, если все потоки используется Mutex равноправные, освобождение Mutex выполняет BOOL ReleaseMutex(HANDLE hMutex).

Семафоры – в некотором смысле они аналогичные Mutex но при их работе посчитается количество обращений. Семафор это объект синхронизации, который содержит счетчик пользователей (потоки которые использует). Счетчик текущего количества ресурсов и максимальное количество ресурсов, которое он контролирует. Обычно они используются для управления множествами ресурсов и также для организации критических секций. Функция создание семафоров

CreateSemaphore(

LPSFCURTTY_ATTRIBUTES lpSemaphoreAttributes, // атрибут доступа

LONG InitialCount* начальное содержание счетчик*

LONG lMaximumCount *максимальное содержание счетчика *

LPCTSTR lpName*имя объекта семафора*);

Если счетчик= отсутствует доступный ресурс, все потоки ожидание какого-то ресурса будут заблокированные, если текущее значения счетчика умещает количество доступных ресурсов на 1 и разрешает доступ к этому ресурсу. Для изменения количества ресурсов

BOOL ReleaseSemaphore

( HANDLE hSemaphore, // хенд семафора

LONG lReleaseCount, // на сколько изменять счетчик

LPLONG lpPreviousCount // предыдущее значение);

Даная функция изменяет количество свободных ресурсов равно второму параметру, предыдущее значение зарисуется в 3 параметр, если в будущем 3 параметр не используется можно задать 0.

Ожидаемые таймеры используются в том случае если нужно использовать фактор времени.

Создание ожидающего таймера

HANDLE CreateWaitableTimer(

LPSECURITY_ATTRIBUTE lpTimerAttribute,\\атрибуты безопасности

BOOL bManualReset,\\ задает ручного или автоматического сброса

LPCTSTR lpTimerName\\ имя таймера

);

Если используется ручной сброс таймера, то после освобождения разблокируются все потоки, которые его ожидают, если автоматический то разблокируется один процесс, который выбирает ОС, при создание таймера его состояние устанавливается в (занят). Для настройки такого таймера

BOOL SetWaitableTimer(

HANDLE hTimer,

const LARGE_INTEGER* pDueTime,//определяет начальное время, когда таймер станет свободным, если <0 то модулю задает количество интервалов до срабатывание таймера, при чем эта величина задается 100 нмс

LONG lPeriod // период, указывает интервал времени в м сек таймер становится свободный, если 0 то таймер сработает только один раз

PTIMERAPCROUTIME pfnComletionRoutine,// функция которая вызывается срабатывание таймера

LPVOID lpArgToCompletionRunTime, // адрес функции

BOOL fResume// (!!!)

);

Данная функция не только настраивает, а также является функцией ожидания, ожидает срабатывание таймера, после этой функции нет смысла ставить «вейтобжект». Внутреннюю функцию вызывает ОС, а не приложение, поэтому ее называют функцией обратного вызова, функция ставится в очередь потока при срабатывании таймера, ее время выполнения должно быть меньше интервала срабатывания таймера. Такая функция ставится в очередь потока взывающей функции «сетветейбел таймер», но лишь в том случае если этот поток находится в состоянии ожидания, если поток не в состоянии ожидания, функция не ставится внутри этого потока и очередь не переполняется. Функция ожидания завершает работу после обработки всех элементов очереди.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]