- •Операционные системы
- •Соответствие алгоритма Петерсона требованиям
- •Понятие мьютекса
- •Неблокирующая реализация
- •Требования к механизмам
- •Блокирующая реализация
- •Проблемы реализации мьютесов
- •Проблемы реализации мьютесов
- •Проблемы реализации мьютесов
- •Рекурсивные и не рекурсивные
- •Рекурсивные и не рекурсивные
- •Рекурсивные и не рекурсивные
- •Рекурсивные и не рекурсивные
- •Shared mutex
- •Shared mutex
Операционные системы
Лекция 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();
}
}