Дизайн операционных систем - PullRequest
1 голос
/ 20 февраля 2012

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

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

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

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

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

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

LD r0,X
INCR r0
STO r0,X

»реализует единственную инструкцию C x = x + 1 "

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

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Вот так:

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)
                      // ...

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

2 голосов
/ 20 февраля 2012

Я думаю, что ваша проблема связана с тем, что вы все еще рассматриваете

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

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

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 прервал процесс A в середине операции декремента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...