2013-08-27 2 views
1

Чтение 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)

ответ

1

Вы должны учитывать время (1) петли в каждом фрагменте кода. Как написано, для этого требуется, чтобы две критические секции выполнялись поочередно.

Это не может быть проблемой, если общее время для каждой из внешних петель примерно одинаково. Если есть значительный дисбаланс, такой как program1, занимающий намного больше времени, чем программа 2, тогда p2 все равно будет ограничено работой на скорости p1.

+0

«рассмотрите цикл while (1) в каждом фрагменте кода. Как указано, для этого требуется, чтобы две критические секции выполнялись поочередно». Наверное, мне не хватает оснований. Если это так, тогда все имеет смысл. Но почему это так? То, как я визуализирую это, заключается в том, что контекстный переключатель может появиться в любое время. Таким образом, как только критическая секция p1 заканчивается, коммутатор контекста принимает конец цикла ожидания p2 и идет своим весельем. – k29

+0

@MatthewHolmes Предположим, что p1 выполняет CS1, а затем начинает вычисление, которое займет 3 часа.p2 делает CS2, один раз, оставляя поворот установленным на 1. Через несколько микросекунд p2 заканчивает программу 2 и возвращается к вершине своего цикла. Он застревает в «while (turn == 1)» в течение следующих 3 часов. поворот останется равным 1 до тех пор, пока p1, через 3 часа, не опустится до вершины своего цикла и снова выполнит CS1. –

0

Скажем, program2 занимает очень много времени, а program1 очень быстро. Верно, что turn будет установлен на 1 перед его выполнением, что позволяет выполнить CS1 и program1. Тем не менее, это установит turn обратно на 2, и он застрянет там до тех пор, пока не закончится program2, что, как я уже упоминал, займет много времени. program1 не может выполнить снова до program2.

Таким образом, program1 не сможет выполнить почти так часто, как мог, потому что он всегда ждет на program2, чтобы закончить.

Смежные вопросы