переключение контекста при создании двусвязного списка - PullRequest
1 голос
/ 19 мая 2011

Есть пример в книге Мориса Баха «Дизайн операционной системы Unix». в котором упоминается, как возможно уничтожить двусвязный список из-за переключение контекста при его создании. (Далее он говорит, что этому препятствует повышение уровня процессора во время таких критических областей кода, но у меня возникают проблемы с пониманием его рассуждений, которые в первую очередь пытаются показать проблему) следует:

struct queue {

} *bp, *bp1;
bp1 -> forp = bp -> forp;
bp1 -> backp = bp;
bp -> forp = bp1;
/* consider possible context switch here */
bp1 -> forp -> backp = bp1;

диаграмма, которую он пишет, показывает изначально:

              |     |
              | bp1 |

->    |    |    ->         |    |
<-    | bp |    <-         |    |

затем, чтобы показать окончательное состояние:

->  |    |  ->  |     |   -> |    |
<-  | bp |  <-  | bp1 |      |    |
       ^
        \                       /
         ----------------------- 

Я пытаюсь пройтись по логике, но я не могу сказать, почему код привел на сломанный двусвязный список, как показано. Может кто-нибудь объяснить, что происходит во время переключения контекста, чтобы вызвать эту проблему?

(p.s. Был бы помечен как двусвязный список, но без разрешения на создание тега)

1 Ответ

1 голос
/ 23 мая 2011

Моя ошибка в недостаточно внимательном чтении - Морис говорит на странице перед диаграммами, как переключение контекста нарушило бы код, ЕСЛИ другой процесс «должен был манипулировать указателями в связанном списке до того, как исходный процесс снова запустится». Я был сбит с толку, потому что пытался получить достаточно информации только из диаграммы и кода, ни в одном из которых не упоминалось о том, что процесс, на который переключается, будет обрабатывать одну и ту же структуру данных в памяти (несмотря на то, что произошло переключение контекста). до сих пор не 100% понятный / мотивированный пример imho). В любом случае, по-видимому, мое собственное ядро ​​немного повредило данные, когда я переключил контекст с чтения одной страницы на другую ..

...