
- •21. Виды программных единиц в современных ос
- •22. Программное порождение процессов в Unix
- •23. Программное порождение процессов в Windows
- •24. Программное уничтожение процессов
- •25. Ожидание завершения процессов
- •26. Иерархия процессов и ее использование
- •27. Понятие нити и связь ее с процессом
- •28. Создание нитей (thread) в программахWindows.
- •29. Создание posiXнитей в программе.
- •Int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp)
- •Int pthread_exit(void *status)
- •30. Уничтожение (отмена) нитей
- •Int pthread_setcancelstate(int state, int *oldstate),
- •Int pthread_setcanceltype(int type, int *oldtype),
- •31. Приостановка и повторный запуск нити.
- •32. Ожидание завершения нити
- •Int pthread_join(pthread_t tid, void** status).
- •33. Абстрактные критические секции.
- •34. Абстрактные двоичные семафоры.
- •35. Абстрактные семафоры с внутренним счетчиком.
- •36. Семафоры взаимоисключения в Windows.
- •37. Семафоры взаимоисключения в posix
- •Int pthread_mutex_lock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_unlock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_init( ptread_mutex_t *hmtx, ptread_mutexattr_*pattr)
- •38. Семафоры событий.
- •39. Средства множественных ожиданий
- •40. Программные семафоры с внутренним счетчиком в Windows.
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.