Моя ошибка в том, что я недостаточно внимательно читал - Морис говорит на странице перед диаграммами, как переключение контекста нарушило бы код, ЕСЛИ другой процесс «должен был манипулировать указателями в связанном списке до того, как исходный процесс снова запустится». Я был сбит с толку, потому что пытался получить достаточно информации только из диаграммы и кода, ни в одном из которых не упоминалось о том, что процесс, на который переключается, будет обрабатывать одну и ту же структуру данных в памяти (несмотря на то, что произошло переключение контекста). все еще не 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. был бы помечен как двунаправленный список, но без разрешения на создание тега)