Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен по ОС_Ответы.doc
Скачиваний:
51
Добавлен:
24.09.2019
Размер:
926.72 Кб
Скачать

17) Средства синхронизации в режиме ядра в ос Windows. (события, семафоры, мьютексы)

События

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

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

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

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

18) Эффект взаимоблокировки (возникновение тупика). (определение, условия возникновения, моделирование)

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

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

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

  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); }

Процесс

Порядок захвата

ресурсов

Порядок освобождения ресурсов

A

S, R

B

T, S

C

T, R

Последовательность:

Последовательность:

Здесь – захват потоком A ресурса R; – освобождение потоком A ресурсов R и S.

Вывод:

  1. тупики возникают не при каждом исполнении;

  2. аккуратным планированием можно избежать блокировок;

  3. блокировки можно обнаружить;