Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция №9




 

SetHandleInformation

GetHandleInformation

 

HANDLE_FLAG_INHERIT

HANDLE_FLAG_PROTECT_FROM_CLOSE (CloseHandle)

 
 

Именование:

Можно задать имя:

HANDLE hMut = CreateMutex(NULL, FALSE, “SomeMutex”);

Проводится проверка, имеется ли объект ядра с нашим именем и происходит проверка типа объекта ядра.

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

Можно осуществить проверку на возникновение ошибки:

If (GetLastError() = = ERROR_ALREADY_EXISTS) {…}

Пространство имен объектов ядра является глобальным, если только не запущен терминал. В последнем случае к имени добавляются префиксы Global\, Local\.

Дублирование:

BOOL DuplicateHandle(

HANDLE hSourceProcessHandle,//описатель исходного процесса (GetCurrentProcess())

HANDLE hSourceHandle, //дублируемый описатель процесса-источника

HANDLE hTargetProcessHandle, //процесс-приемник

PHANDLE phTargetHandle, //описатель в процессе-приемнике

DWORD dwPesiredAccess,

DWORD dwQotions);

Особенность: нужно использовать механизм межпроцессного взаимодействия для передачи продублированного описателя (DuplicateHandle его сформирует, но нужно также поставить в известность и сам процесс-приемник).

 

События

События бывают:

- со сбросом вручную;

- с автоматическим сбросом.

 

HANDLE CreateEvent (

PSECURITY_ATTRIBUTES sa,

BOOL fManualReset,

BOOL fInitialState,

hPCTSTR name);

 

BOOL SetEvent (HANDLE); – устанавливает в сигнальное состояние

BOOL ResetEvent (HANDLE); – устанавливает в несигнальном состояние

BOOL PulseEvent (HANDLE); – “комбинация” Set и Reset (устанавливает в сигнальное состояние и сбрасывает в несигнальное)

 

Если событие с автосбросом, только один поток продолжит исполнение, а если со сбросом вручную – оба потока.

 

Семафоры

Смысл семафоров – подсчет числа доступных ресурсов (счетчик). Определены 2 операции:

· возврата ресурсов в пул доступных ресурсов (up-операция, v-операция). Увеличивает счетчик.

· захвата ресурсов (down-операция, p-операция).

Если счетчик ресурсов принимает значение 0, то поток блокируется (семафор нахо­дится в несигнальном состоянии).

Счетчик не может быть больше максимального числа ресурсов и меньше 0.

 

CreateSemaphore (

PSECURITY_ATTRIBUTES sa,

LONG lInitialCount,

LONG lMaxCount,

hPCTSTR name);

 

Операция DOWN:

BOOL ReleaseSemaphore (HANDLE, LONG ReleaseCount);

 

Мьютексы

Мьютекс, Mutex – от англ. Mutual Exclusion, взаимное исключение.

 

HANDLE CreateMutex(

PSECURITY_ATTREBUTES sa,

BOOL fInitialOwner,

LPCTSTR name);

 

BOOL ReleaseMutex (HANDLE);

Мьютекс можно рассматривать как бинарный семафор. Также мьютекс похож и на критическую секцию.

От семафора мьютекс отличается тем, что определено владение мьютексом для захвативших его потоков.

Отличие от критических секций: можно синхронизировать потоки в разных процес­сах, можно указывать тайм-аут.

Если поток «владеет» мьютексом, то вызов Wait-функции с этим мьютексом завершится успешно, при этом увеличится внутренний счетчик рекурсий. ReleaseMutex выполняет декремент счетчика рекурсий и освобождает мьютекс, если счетчик достигает «0».

Если попытаться освободить мьютекс из процесса, который им не владеет, то будет ошибка:

GetLastError = ERROR_NOT_OWNED

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

GetLastError = WAIT_ABANDONED

Тупики и защита от них

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

Условия возникновения тупика:

1. Условие взаимного исключения: каждый ресурс отдан или доступен ровно од­­ному процессу.

2. Условие удержания и ожидания: процессы, удерживающие полученные ра­нее ресурсы, могут запрашивать новые.

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

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

 

Моделирование блокировок, Холт (Holt)

Введем графические обозначения:

 

Простейший тупик:

 
 
DWORD Thr2(PVOID){ WaitforSingleObject(U); WaitforSingleObject(T); //критическая секция ReleaseMutex(T); ReleaseMutex(U); }  


DWORD Thr1(PVOID){

WaitforSingleObject(T);

WaitforSingleObject(U);

//критическая секция

ReleaseMutex(U);

ReleaseMutex(T); }

 




Поделиться с друзьями:


Дата добавления: 2014-12-07; Просмотров: 369; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.