переключение контекста при создании двусвязного списка

В книге Мориса Баха «Дизайн операционной системы 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. был бы помечен как двусвязный список, но без разрешений на создание тегов)


person inman320    schedule 19.05.2011    source источник


Ответы (1)


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

person inman320    schedule 23.05.2011