Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / Answers (20-40).docx
Скачиваний:
212
Добавлен:
15.06.2014
Размер:
38.2 Кб
Скачать

34. Абстрактные двоичные семафоры.

Общий подход к монополизации ресурсов с помощью специальных системных операций предложил голландский математик Е. Дейкстра. Этот подход состоит в построении и использовании семафоров. Семафор – это защищенная от прямого доступа переменная, значения которой можно опрашивать и изменять только с помощью специальных операций P и V; кроме того, в самом начале к семафору применяется операция инициализации.

Простейшей формой семафоров являются двоичные семафоры, которые могут принимать только значения 0 и 1. Операции P и V над двоичными семафорами определяются следующим образом. Пусть S - двоичный семафор.

Для удобства и сокращения формулировок будем временно называть абстрактный процесс – задачей.

Операция P(S) выполняет действия: если S равно 1, то занести в S значение 0, иначе БЛОКИРОВАТЬ нить по семафору S, и если очередь готовых задач не пуста, то УСТАНОВИТЬ на процессор задачу из этой очереди. Операция V(S) выполняет действия: если список задач, заблокированных по семафору S, не пуст, то ДЕБЛОКИРОВАТЬ задачу из этой очереди (т.е. перевести ее в очередь готовых задач), иначе занести в S значение 1.

Для двоичных семафоров значение семафора 1 обозначает, что ресурс, защищаемый семафором, свободен, а значение семафора 0 – что ресурс занят.

35. Абстрактные семафоры с внутренним счетчиком.

Более сложной формой семафора является считающий, который по определению принимает любые неотрицательные значения. Операции P и V для считающего семафора S определяются следующими описаниями действий:

P(S) : если S > 0, то S  S - 1, иначе WAIT(S);

V(S) : если список задач, заблокированных по семафору S, не пуст, то ДЕБЛОКИРОВАТЬ задачу из этой очереди (т.е. перевести ее в очередь готовых задач), иначе S  S +1

Эта форма семафоров обусловила название операций: P – proberen (проверить), V – verholen (увеличить) на голландском языке. Считающий семафор показывает число единиц свободного ресурса.

Считающий семафор может быть обобщен путем распространения его значений на отрицательные числа следующим определением операций P и V:

P(S) : S  S - 1; если S < 0, то WAIT(S);

V(S) : S  S +1; если S  0, то ДЕБЛОКИРОВАТЬ задачу из этой очереди (т.е. перевести ее в очередь готовых задач).

Обобщенный считающий семафор своим значением равен разности между числом единиц наличного ресурса и числом запросов на них. При S  0 значение такого семафора показывает число свободных единиц ресурса, при S < 0 – число задач, заблокированных по семафору S.

36. Семафоры взаимоисключения в Windows.

Наиболее простой и естественной формой стали семафоры взаимоисключения (mutual exclusion semaphore), сокращенно именуемые (по сокращению из английского названия – mutex) семафорами. Семафоры mutex отличаются от двоичных семафоров тем, что операцию V над семафором может осуществить только тот процесс, который выполнил предыдущую операцию P над ним без блокировки от такого действия. Для описания и использования этого ограничения вводится понятие владения семафором.

Операции, аналогичные абстрактным P и V, над семафорами взаимоисключения называются по-разному. Так, в операционной системе Windows запрос на владение таким семафором (аналогичный операции P) использует универсальную функцию ожидания любого объекта с именем WaitForSingleObject. Для аналога операции V в рассматриваемых ОС разработчиками приняты следующие названия: в Windows – ReleaseMutex.

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

Имея хэндл, нить может использовать функции запроса владения и в дальнейшем – освобождения семафора владельцем mutex.

Для создания сем-ра:

HANDLE CreateMutex(SECURITY_ATTRIBUTES *MtxAttrs (адрес атрибутов защиты), BOOL bInitialOwner (наследование), STR *Name (имя сем-ра)); Ф-ия создает семафор и возвращает его хэндл.

Для доступа к сем-ру,созданному др.процессом:

HANDLE OpenMutex(DWORD DesiredAccess, BOOL bInheritHandle, STR *Name);

DesiredAccess: MUTEX_ALL_ACCESS(заданы все возможн флаги доступа) или SYNCHRONIZE (полученный хэндл можно исп-ть в любых ф-иях ожидания события).

Параметр bInheritHandle показывает,будет ли наследоваться хэндл сем-ра потомками данного процесса.Чтоб наследов-е происходило, параметр задавать TRUE.

Для запроса владения семафора Windows использует общую функцию ожидания WaitForSingleObject, а для его закрытия - общую функцию CloseHandle.

Соседние файлы в папке Экзамен