Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция-8.pptx
Скачиваний:
4
Добавлен:
01.10.2022
Размер:
194.87 Кб
Скачать

Операционные системы

Лекция 9. Мьютексы

Соответствие алгоритма Петерсона требованиям

к механизмам взаимного исключения

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

В программе не должно быть никаких предположений о скорости выполнения процессов и о количестве процессоров в системе.

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

Недопустима ситуация «вечного ожидания», при которой некоторый процесс никогда не получит доступ в нужную ему критическую секцию (ресурсное голодание – resource starvation).

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

Понятие мьютекса

Под мьютексом (mutex – mutual exclusion) обычно понимается объект, имеющий два состояния – открыт и закрыт, и, соответственно, две операции – lock (запереть) и unlock (открыть).

Операция unlock всегда переводит объект в состояние «открыт».

Операция lock имеет две разновидности:

1.Блокирующая операция

2.Неблокирующая операция

Неблокирующая реализация

мьютекса

while (isFree == 0) {}

while (!lock(s)) {} section(); unlock(s);

isFree = 0; section(); isFree = 1;

lock(s) – возвращает true при применении функции к открытому мьютексу, если мьютекс закрыт функция возвращает false.

Требования к механизмам

взаимного исключения

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

В программе не должно быть никаких предположений о скорости выполнения процессов и о количестве процессоров в системе.

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

Недопустима ситуация «вечного ожидания», при которой некоторый процесс никогда не получит доступ в нужную ему критическую секцию (ресурсное голодание – resource starvation).

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

Блокирующая реализация

мьютекса

lock(s); section(); unlock(s);

lock(s) – при применении к

открытому мьютексу,

закрывает его и возвращает управление;

при применении к закрытому мьютексу она блокирует

вызвавший процесс до тех пор, пока мьютекс не окажется открытым, после

чего закрывает его и возвращает управление.

Проблемы реализации мьютесов

section .data

mutex = 0

 

mutex dd

0

 

 

section .text

 

 

lock:

 

lock

 

mov

eax, 1

eax = 1mutex = 0

.again

 

 

 

xchg

eax, [mutex]

eax = 0

mutex = 1

cmp

eax, 0

 

 

jne

.again

 

 

ret

 

 

 

unlock:

mov dword [mutex], 0 ret

Проблемы реализации мьютесов

section .data

mutex = 1

 

mutex dd

0

 

 

section .text

 

 

lock:

 

lock

 

mov

eax, 1

eax = 1mutex = 1

.again

 

 

 

xchg

eax, [mutex]

eax = 1

mutex = 1

cmp

eax, 0

 

 

jne

.again

 

 

ret

 

 

 

unlock:

mov dword [mutex], 0 ret

Проблемы реализации мьютесов

lock:

 

mov

eax, 1

.again

 

xchg

eax, [mutex]

cmp

eax, 0

je

.ok

call switch_threads

jne

.again

.ok

 

ret

 

Рекурсивные и не рекурсивные

мьютексы

class concurrentList<T> { mutex m;

public void append(T value) { m.lock();

if (getSize() > 10) resize();

//

m.unlock();

}

public int getSize() { m.lock();

//

m.unlock();

}

}

Соседние файлы в предмете Операционные системы