
- •Глава OS3: Многопоточность
- •Права
- •План части 3.1.
- •Проблема критических секций
- •Решение проблемы критической секции
- •Решения проблемы
- •Первый вариант: Алгоритм 1
- •Второй вариант: Алгоритм 2
- •Третий вариант: Алгоритм 3
- •Алгоритм Деккера (1965)
- •Алгоритм Деккера (продолж.)
- •Алгоритм Бейкери
- •Алгоритм Бейкери
- •Алгоритм Бейкери
- •Взаимоисключение – аппаратная поддержка
- •Устройства синхронизации
- •Взаимоисключение с
- •Устройства синхронизации
- •Взаимоисключение и обмен
- •Семафоры
- •Критические секции n потоков
- •Реализация семафоров
- •Реализация
- •Семафоры как основной метод синхронизации
- •Два типа семафоров
- •Замыкание и нехватка ресурсов
- •Синхронизация в Windows
- •Синхронизация в Линукс
- •Для дальнейшего чтения

Глава OS3: Многопоточность
3.1. Многопоточность, критические секции, семафоры
Windows Operating System Internals - by David A. Solomon and Mark E. Russinovich with Andreas Polze

Права
© 2000-2005 David A. Solomon and Mark Russinovich
These materials are part of the Windows Operating System Internals Curriculum Development Kit,
developed by David A. Solomon and Mark E. Russinovich with Andreas Polze
Microsoft has licensed these materials from David Solomon Expert Seminars, Inc. for distribution to academic organizations solely for use in academic environments (and not for commercial use)
2

План части 3.1.
Проблемы критических секций
Программные решения
Устройства синхронизации
Семафоры
Синхронизация в Windows и Linux
3

Проблема критических секций
n потоков, пытающихся получить один общий ресурс (напр., общие данные)
Каждый поток имеет сегмент кода, называемый критической секцией, во время
исполнения которого происходит доступ к общим данным
Проблема:
Необходимо убедиться, что когда один поток выполняет критическую секцию, всем остальным потокам запрещено выполнять свою критическую секцию
4

Решение проблемы критической секции
1. Взаимоисключение
Среди тех потоков, которые используют одни и те же общие ресурсы или данные, только одному потоку за одну единицу времени разрешено выполнять свою критическую секцию,
Поток, остановленный во время некритической сессии не должен влиять на другие потоки.
2. Прогресс
Поток находится в критической секции только ограниченное количество времени.
Не требуется выяснение относительной скорости потока
3. Ограниченное ожидание
Нельзя допускать ситуации, когда поток, которому необходим доступ к критической секции, ждал неопределенное количество времени.
Когда ни один поток не находится в критической сессии, любой поток, которому необходим доступ, может быть пропущен без задержки.
5

Решения проблемы
Только 2 потока, T0 и T1
Общая структура потока Ti (другой поток Tj) do {
секция входа
критическая секция
секция выхода
остальные секции
} while (1);
У потоков должны быть некоторые общие переменные для синхронизации действий.
6

Первый вариант: Алгоритм 1
Инициализация общих переменных
int turn = 0;
turn == i Ti может войти в критическую секцию
Поток Ti
do {
while (turn != i) ;
критическая секция turn = j;
остальные секции } while (1);
Соответствует взаимоисключению, но не прогрессу
7

Второй вариант: Алгоритм 2
Инициализация общих переменных
int flag[2]; flag[0] = flag[1] = 0;
flag[i] == 1 Ti может входить в критическую секцию
Поток Ti
do {
flag[i] = 1;
while (flag[j] == 1); критическая секция
flag[i] = 0; остальные секции
} while(1);
Соответствует взаимоисключению, но не прогрессу.
8

Третий вариант: Алгоритм 3
(Алгоритм Петерсона - 1981)
Инициализация общих переменных алгоритмов 1 и 2:
int flag[2]; flag[0] = flag[1] = 0; int turn = 0;
Поток Ti
do {
flag[i] = 1; turn = j;
while ((flag[j] == 1) && turn == j) ; критическая секция
flag[i] = 0; остальные секции } while (1);
Решает проблему критической секции для двух потоков
9

Алгоритм Деккера (1965)
Это первое правильно работающее решение для двухпоточных (двухпроцессорных) случаев.
Изначально разработанный Деккером для других задач, после был приспособлен для решения проблемы критической секции Дейкстрой.
Деккер вносит идею о привилигированых потоках и разрешает доступ к ресурсу, когда запрос доступа не оспорен другим потоком.
Когда происходит конфликт, одному потоку присваивается статус привелегированого, и, после успешного выполнения критической секции, приоритеты меняются
1