2012-02-19 4 views
1

Я работаю над домашней проблемой из операционных систем Stalling: внутренними и проектными принципами. Таким образом, я не прошу ответа, но любая помощь в понимании этого была бы полезна, так как мне тяжело обволакивать голову вокруг этого. Есть два процесса, исполняющие:Состояние операционной системы Состояние гонки

Оба процесса выполнения следующий код:

shared int x; 
x = 10; 
while (1) 
{ 
    x = x - 1; 
    x = x + 1; 
    if (x != 10) 
     printf(“x is %d”,x) 
} 

Первая часть этого вопроса спросил, как «х 10» может быть напечатано, что у меня не было никаких проблем отслеживания логики для.

Однако вторая часть спрашивает, как напечатать «x is 8». Кроме того, он дает подсказку:

«Вы должны помнить, что приращение/декремент на уровне исходного языка не выполняется атомарно, то есть, код на языке ассемблера:»

LD r0,X 
INCR r0 
STO r0,X 

«реализует единственный C инструкция x = x + 1 "

Несмотря на подсказку, мне не удается увидеть, как процесс может когда-либо достигнуть секции printf без увеличения значения до девяти. Что мне не хватает?

ответ

4

Как это:

Thread 1    Thread 2 

Load x (10) 
Decr x (9) 
Store x (9) 
         Load x (9) 
Load x (9) 
Incr x (10) 
Store x (10) 
         Decr x (8) 
         Store x (8) 
Load x (8) 
Print x (8) 
         // ... 

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

+1

Он специально попросил не дать ответ. –

+0

А, конечно, я знал, что у меня что-то не хватает мысленно, и это было то, что Load x справа. Сейчас имеет смысл, спасибо за разъяснение, я скоро примусь, ожидая, когда истечет срок, чтобы принять участие. –

+0

@HunterMcMillen - Не совсем. Он сказал, что он «не просит ответа» - он никогда не просил не давать ответа. – Steve

1

Я думаю, что проблема у вас возникли исходит из того, что вы по-прежнему рассматривают

x = x - 1 и x = x + 1 одной операции.

Попробуйте думать о том, что произойдет, если для процесса экземпляра B прерывания процесса начальной операции A в x=x-1 операций украв CPU, то есть:

Process A    Process B    X    r0 
------------------------------------------------------------------- 
LD r0, x          10   10 
         LD r0, x    10   10 
         DECR r0     10    9 
         STORE r0,x    9 

Здесь процесс B прерванный процесс А в середине их операция декремента ,

+0

Это также было очень полезно, спасибо, что нашли время написать его. +1 здесь тоже. –

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