【问题标题】:context switch during doubly linked list creation双链表创建期间的上下文切换
【发布时间】:2011-05-19 14:45:17
【问题描述】:

莫里斯·巴赫的《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. 会被标记为双向链表,但没有标签创建权限)

【问题讨论】:

    标签: operating-system linked-list context-switch


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2012-05-09
      • 2021-06-05
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2011-01-09
      相关资源
      最近更新 更多