2011-05-19 19 views
1

在Maurice Bach的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 |  | | 
    ^
     \      /
     ----------------------- 

我試圖通過邏輯,但我不知道爲什麼代碼會導致 到一個破碎的雙向鏈表,如圖所示。有人可以解釋在上下文切換期間發生了什麼 導致此問題?

(PS會標記爲雙向鏈表,但沒有標籤創建權限)

回答

1

我在沒有閱讀不夠仔細的錯誤 - 莫里斯說,在圖中的上下文切換將如何破解代碼之前的頁面如果另一個進程「在原始進程再次運行之前操縱鏈表上的指針」。我很困惑,因爲我試圖從圖表和代碼中獲取足夠的信息,但都沒有提到切換到的過程會處理內存中的相同數據結構(儘管存在上下文切換..仍然不是100%清晰/有動力的例子)。無論哪種方式,顯然我自己的內核有一些數據損壞時,我做了從閱讀一頁到下一個上下文切換..