
Терминология
активное ожидание (в цикле) (busy wait)
алгоритм Деккера (Dekker's Algorithm)
алгоритм Лэмпорта, алгоритм кондитера (Lamport's Bakery Algorithm)
асинхронность (asynchronism)
асинхронные параллельные процессы (asynchronous concurrent processes)
бесконечное откладывание (процесса) (indefinite postponement)
блокировка памяти (защитная) (storage interlock)
взаимоисключение (mutual exclusion)
взаимоисключение для двух процессов (two-process mutual exclusion)
взаимоисключение для n процессов (n-process mutual exclusion)
входвзаимоисключения (entermutualexclusion)
выделение (в самостоятельный элемент), форматирование, обрамление ограничителями (encapsulation)
выходвзаимоисключения (exitmutualexclusion)
двоичный семафор (binary semaphore)
Дейкстра (Dijkstra)
жесткая (пошаговая) синхронизация (lockstep synchronization)
защищенная переменная (protected variable)
код входа взаимоисключения (mutual exclusion entry code)
код выхода взаимоисключения (mutual exclusion exit code)
команда проверки и установки (testandset instruction)
координированный (последовательный) доступ (sequentialization)
критическая область (critical section)
критический участок (critical region)
неделимые операции (indivisible operations)
общие, разделяемые, совместно (коллективно) используемые данные (shared data)
общие, разделяемые, совместно (коллективно) используемые ресурсы (shared resource)
операция Р (Р operation)
операция V (V operation)
параллелизм (совмещение) (concurrency)
параллельные вычисления (параллельная обработка) (parallel processing)
параллельное программирование (concurrent programming)
примитивы взаимоисключения (mutual exclusion primitives)
протокол блокирования/пробуждения (block/wakeup protocol)
семафор (semaphore)
синхронизация процессов (process synchronization)
степень параллелизма (level of parallelism)
считающий семафор (семафор со счетчиком) (counting semaphore)
тупик, дедлок (deadlock)
цепочка (нить, последовательность) управления (thread of control)
cobegin/coend
parbegin/parend
Упражнения
1. Назовите несколько причин, обусловливающих важность и актуальность исследования параллелизма для изучающих операционные системы.
2.Преобразуйте следующее выражение с использованием конструкции parbegin/parend для обеспечения максимального параллелизма: 3*a*b+4/(c4-d)**(e—f).
3.Преобразуйте следующую программу параллельных вычислений в простую последовательность операций:
а : = b+с;
parbegin
d : = b*c - x;
е : = а/6+п**2 parend
4. Почему может оказаться неприемлемой следующая программа:
parbegin
а : = b+c;
d : = b*c—x;
е : = a/6+n**2 parend
5.Приведите несколько причин, по которым можно считать ложным следующее утверждение: «Когда несколько процессов работают с общей, разделяемой информацией, хранящейся в основной памяти, во избежание получения неопределенных результатов необходимо обеспечивать взаимоисключение.
6.Для реализации взаимоисключения можно использовать алгоритм Деккера, команду проверки и установки testandset и операции Р и V над семафорами. Укажите сходства и различия всех этих способов, а также рассмотрите их относительные достоинства и недостатки.
7.Мы предполагали, что, когда два процесса одновременно пытаются выполнить примитив «входвзаимоисключения», «победитель» выбирается случайным образом. Обсудите следствия этого предположения.
8.Прокомментируйте следующий пример использования примитивов взаимоисключения:
какиетооператорыодии;
входвзаимоисключения;
какиетооператорыдва;
входвзаимоисключения;
какиетооператорытри;
выходвзаимоисключения;
какиетооператорычетыре;
выходвзаимоисключения;
какиетооператорыпять
9.В чем заключается действительный смысл алгоритма Деккера?
10.Проведите исчерпывающий временной анализ алгоритма Деккера. Имеются ли в этом алгоритме какие-либо слабости?
11. Не ссылаясь на известные варианты реализации примитивов взаимоисключения для п процессов, разработайте собственный способ решения этой проблемы. (Это очень сложная проблема.)
12.Способ реализации взаимоисключения для п процессов, который предложили Эйзенберг и Макгайр (Ei 72), гарантирует, что процесс войдет в свой критический участок не более чем за п—1 попыток. Можно ли надеяться, что удастся получить лучшее решение для n процессов?
13.Примитивы взаимоисключения можно реализовать с использованием режима активного ожидания или блокирования процессов. Обсудите возможности применения и относительные достоинства обоих способов.
14.Объясните достаточно подробно, каким образом можно реализовать в ядре операционной системы семафоры и операции над семафорами.
15.Объясните, каким образом при помощи запрещения и разрешения прерываний можно достаточно эффективно реализовать примитивы взаимоисключения в однопроцессорной машине.
16. Почему V-операцию необходимо выполнять как неделимую?
17..Что произойдет в программе, приведенной на рис. 4.11, если в процессе-потребителе поменять местами Р-операторы? Что произойдет, если в процессе-производителе поменять местами V-операторы?
18. Перепишите программу, приведенную на рис. 4.9, с использованием считающих семафоров, с тем чтобы обеспечить управление доступом к пулу из пяти идентичных ресурсов.
19.Как упоминалось в тексте, критические участки, в которых производятся обращения к непересекающимся множествам разделяемых переменных, фактически могут выполняться одновременно. Предположим, что каждый из примитивов взаимоисключения модифицирован таким образом, что включает в качестве параметров список конкретных разделяемых переменных, к которым будет производиться обращение в критическом участке.
а) Прокомментируйте следующий вариант использования этих новых примитивов взаимоисключения:
какиетооператорыодин;
входвзаимоисключения(а);
какиетооперациис«а»;
входвзаимоисключения (b);
какиетооперациис«а»и«b»;
выходвзаимоисключения(b);
ещекакиетооперациис«а»;
выходвзаимоисключения(а);
какиетооператорыдва;
б) Предположим, что два процесса, приведенных ниже, работают параллельно. Какие при этом возможны результаты?
ПРОЦЕССОДИН: ПРОЦЕССДВА:
… …
входвзаимоисключения(а); входвзаимоисключения(b);
… …
входвзаимоисключения(b); входвзаимоисключения(а);
… …
выходвзаимоисключения(b); выходвзаимоисключения(а);
… …
выходвзаимоисключения(а); выходвзаимоисключения(b);
… …
20. Во многих вычислительных машинах примитивы взаимоисключения реализуются при помощи микрокода. Приведите несколько причин, обусловливающих целесообразность подобного подхода.
21.Что произойдет (и произойдет ли что-либо), если при реализации алгоритма Деккера поменять местами оба оператора присваивания в коде выхода взаимоисключения?