1

Maurice Bach 的 The Design of the Unix Operating System 中有一个例子,它提到了双向链表在创建过程中如何由于上下文切换而被破坏。(他接着说,通过在代码的这些关键区域提高处理器级别可以防止这种情况发生,但我无法理解他试图首先显示问题的推理)他包含的示例代码如下如下:

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 |      |    |
       ^
        \                       /
         ----------------------- 

我正在尝试遍历逻辑,但我不知道为什么代码会导致如图所示的损坏的双向链表。有人可以解释在上下文切换期间发生了什么导致这个问题吗?

(ps 会被标记为双向链表,但没有标签创建权限)

4

1 回答 1

1

我没有仔细阅读的错误 - Maurice 在图表之前的页面中说,如果另一个进程“在原始进程再次运行之前操纵链表上的指针”,上下文切换将如何破坏代码。我很困惑,因为我试图从图表和代码中获取足够的信息,但两者都没有提到被切换到的进程将在内存中处理相同的数据结构(尽管有上下文切换..仍然不是 100% 清晰/有动力的例子恕我直言)。无论哪种方式,当我将上下文从读取一页切换到下一页时,显然我自己的内核有一些数据损坏。

于 2011-05-23T00:30:56.880 回答