Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Operatsionnye_sistemy.ppt
Скачиваний:
94
Добавлен:
03.06.2014
Размер:
6.28 Mб
Скачать

Первоначальные попытки решения проблемы

Есть только два процесса, P0 и P1

Общая структура процесса Pi: do {

entry section critical section exit section remainder section } while (1);

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

71

Алгоритм 1

Общие переменные:

shared int turn; первоначально turn = 0

turn == i процесс Pi может войти в

критическую секцию

Процесс Pi :

do {

while (turn != i) ; critical section

turn = j;

remainder section

}while (1);

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

72

Алгоритм 2

Общие переменные

boolean flag[2];

первоначально flag [0] = flag [1] = false.

flag [i] == true Pi готов войти в критическую

секцию

Процесс Pi : do {

flag[i] := true;

while (flag[j]) ; critical section flag [i] = false;

remainder section

}while (1);

Удовлетв принципу “взаимное исключение”, но не принципу “прогресс” алгоритм не различает информацию о том, что процесс еще только готов войти в свою критическую секцию, и о том, что он в нее уже вошел.

73

Алгоритм 3 (Петерсона, 1981)

Объединяет общие переменные алгоритмов 1 и 2.

Процесс Pi : do {

flag [i]:= true; turn = j;

while (flag [j] and turn = j) ; critical section

flag [i] = false; remainder section } while (1);

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

74

Алгоритм булочной (bakery algorithm)

алгоритм как бы воспроизводит стратегию автомата в (американской) булочной, где каждому клиенту присваивается его номер в очереди.

Обозначения: < лексикографический порядок

(a,b) < (c,d) если a < c or if a = c and b < d

max (a0,…, an-1)- число k, такое, что k ai for i - 0,

…, n – 1

Общие данные: boolean choosing[n]; int number[n];

Структуры данных инициализируются, соответственно, false и 0

75

Алгоритм булочной

do {

choosing[i] = true;

number [i] = max (number[0], number[1], …, number[n-1]) + 1;

choosing[i] = false; for (j = 0; j < n; j++) {

while choosing[j];

while ((number[j] != 0) && (number[j] < number[i]));

}

критическая секция number [i] = 0;

остальная часть кода } while (1)

76

Аппаратная поддержка синхронизации

Атомарная операция проверки и модификации значения переменной

TestAndSet, которая атомарно выполняет считывание и запоминание значения переменной, затем изменяет его на заданное значение, но в результате выдает первоначальное значение переменной.

.

boolean TestAndSet(boolean &target) { boolean rv = target;

target = true; return rv;

}

77

Взаимное исключение с помощью TestAndSet

• Общие данные:

boolean lock = false;

• Процесс Pi do {

while (TestAndSet(lock)) ; critical section

lock = false; remainder section

} while (1)

• Значение переменной lock, равное true,означает, что вход в критическую секцию заблокирован. Каждый процесс ждет, пока он не разблокируется, затем, в свою очередь, выполняет блокировку и входит в критическую секцию. При ее завершении процесс разблокирует критическую секцию

присваиванием lock значения false.

78

Аппаратное решение для синхронизации

Атомарная перестановка значений двух переменных.

Другое распространенное аппаратное решение для синхронизации – атомарная операция Swap, выполняющая перестановку значений двух переменных:

void Swap (boolean * a, boolean * b) { boolean temp = * a;

*a = * b;

*b = temp;

}

79

Взаимное исключение с помощью

Swapfalse

• Общие данные (инициализируемые ): boolean lock;

boolean waiting[n];

• Процесс Pi do {

key = true;

while (key == true) Swap(&lock, &key); critical section

lock = false; remainder section } while (1)

При данной реализации, условием ожидания процесса перед входом в критическую секцию является условия (key == true),которое фактически означает то же, что и в предыдущей реализации, - закрытое состояние блокировщика, т.е., то, что другой процесс находится в своей критической секции. Когда критическая секция освободится (освобождение осуществляется присваиванием lock =

false после завершения критической секции в исполнившем ее процессе), ее начнет исполнять текущий процесс.

80

Соседние файлы в папке ОС