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

ге Мориса Баха «Дизайн операционной системы 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)

Ваш ответ на вопрос