在莫里斯·巴赫的《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 | | |
^
\ /
-----------------------
我正在尝试遍历逻辑,但我不知道为什么代码会导致如下所示的断开的双向链表。有人能解释一下在上下文切换过程中发生了什么导致这个问题吗?
(附注:将标记为双向链接列表,但没有创建标签的权限)
发布于 2011-05-23 08:30:57
我的错误是没有仔细阅读-- Maurice在图表前的页面中说,如果另一个进程“在原始进程再次运行之前操纵链表上的指针”,上下文切换将如何破坏代码。我很困惑,因为我试图仅从图表和代码中获得足够的信息,这两个都没有提到切换到的进程将在内存中处理相同的数据结构的事实(尽管有上下文切换...仍然不是一个100%清晰/有动力的例子)。无论哪种方式,当我从一个页面读到下一个页面时,显然我自己的内核有一些数据损坏。
https://stackoverflow.com/questions/6060456
复制相似问题