Чтение http://www.ics.uci.edu/~bic/courses/JaverOS/ch2.pdf и на странице 20 есть это:Не понимаю, недостаток этого алгоритма критической секции решения
Проблема легко решается, если мы настаиваем, что
p1
иp2
ввести свои критические секции> попеременно; одна общая переменная, поворот, может отслеживать, чей это направление. Эта идея реализована в нашем первом алгоритме ниже.
/* CS Algorithm: Try #1 */
int turn = 1;
cobegin
p1: while (1)
{
while (turn==2) ; /*wait loop*/
CS1; turn = 2; program1;
}
//
p2: while (1)
{
while (turn==1) ; /*wait loop*/
CS2; turn = 1; program2;
}
coend
Первоначально
turn
устанавливается в 1, что позволяетp1
ввести свой CS. После выхода процесс устанавливаетturn
в 2, что теперь позволяетp2
ввести его CS и так далее. К сожалению, еслиprogram1
были намного длиннее, чемprogram2
, или еслиp1
остановлен вprogram1
, это решение вряд ли будет удовлетворительным. Один процесс далеко за пределами критической секции может помешать другим входить в критическую секцию, нарушив тем самым требования 1 было указано выше
Часть I выделяется полужирным шрифтом, кажется ложным мне. Так как program1
выполняет после критической секции и после turn
получает значение 2, ничего не останавливается p2
, оставляя цикл ожидания и входя в его критический раздел, независимо от того, что происходит в program1
. Похоже, это идеальное решение для меня.
Я прав? Я что-то не вижу?
(ПРИМЕЧАНИЕ. p1
является нить и program1
является некритическим частью p1
)
«рассмотрите цикл while (1) в каждом фрагменте кода. Как указано, для этого требуется, чтобы две критические секции выполнялись поочередно». Наверное, мне не хватает оснований. Если это так, тогда все имеет смысл. Но почему это так? То, как я визуализирую это, заключается в том, что контекстный переключатель может появиться в любое время. Таким образом, как только критическая секция p1 заканчивается, коммутатор контекста принимает конец цикла ожидания p2 и идет своим весельем. – k29
@MatthewHolmes Предположим, что p1 выполняет CS1, а затем начинает вычисление, которое займет 3 часа.p2 делает CS2, один раз, оставляя поворот установленным на 1. Через несколько микросекунд p2 заканчивает программу 2 и возвращается к вершине своего цикла. Он застревает в «while (turn == 1)» в течение следующих 3 часов. поворот останется равным 1 до тех пор, пока p1, через 3 часа, не опустится до вершины своего цикла и снова выполнит CS1. –