在Maurice Bach的Unix操作系统设计中有一个例子 提到如何将双重链表摧毁,因为 创建过程中的上下文切换。 (他继续说这是通过在代码的这些关键区域内提高处理器级别来防止这种情况,但是我无法理解他试图首先显示问题的推理)他包含的示例代码是as 如下:
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。会标记为双链表,但没有标签创建权限)
答案 0 :(得分:1)
我没有仔细阅读的错误 - 莫里斯在图表之前的页面中说如何上下文切换会破坏代码如果另一个进程“在原始进程再次运行之前操纵链表上的指针”。我很困惑,因为我试图从图表和代码中获取足够的信息,这两者都没有提到切换到的进程将在内存中处理相同的数据结构这一事实(尽管存在上下文切换...仍然不是100%明确/积极的例子imho)。无论哪种方式,当我将上下文切换从一个页面切换到下一个页面时,显然我自己的内核有一些数据损坏。