回覆列表
  • 1 # 使用者5332761066457

    不會出現問題的,具體過程如下。

    假設執行緒開始執行在core1上,對記憶體x將舊值b更改成新值a,在完成mov [x], a指令時,a這個值至少已經寫到core1上的store buffer裡面了。

    執行緒要被遷移到core2,那必須是它被搶佔,或主動讓出cpu,或者主動睡眠才可以發生遷移到core2. 但不管什麼情況,它必須在core1執行完schedule函式之後,才會發生遷移。

    而schedule函式有以下一段程式碼:

    注意上述最後兩條語句,它會產生一個mb,意味著執行到mb之後,剛才將x修改為a的操作,會從store buffer寫到L1 Cache,並且會將invalid message傳送到其它核的invalid queue上。

    之後執行緒才被排程出來了。

    而執行緒被core2遷移過來時,它要執行,也必須是另一個執行緒執行schedule之後才能輪到該執行緒執行。同樣,scheuld函式在core2執行時,因為有mb語句,它必須將本core2的invalid queue上的請求應用到本核的L1 Cache上,才能往前執行,此時Core2上L1 Cache上x的值狀態變為invalid。

    所以執行緒在core2執行完schedule後,還沒有返回到使用者態執行,那此時Cache情況如下:

    Core1: x值,有效,為a,Exclusive狀態

    Core2: x值,無效, 因為收到core1的invalide message並應用到本Cache

    然後執行緒執行到使用者態時,訪問x變數,本地cache是invalid,會發送讀cache請求到core1,core1返回x的值為a給core2,此時core1/core2對x地址的狀態均為Share。

    所以Linux已 處理好程序排程與Cache的關係了。

  • 中秋節和大豐收的關聯?
  • 2006年世界盃,8強,前4排名?