簡體   English   中英

互斥鎖可以取代內存障礙嗎

[英]Can mutex replace memory barriers

我試圖理解內存障礙,並遇到了以下Wikipedia鏈接http://en.wikipedia.org/wiki/Memory_barrier這很好地解釋了這一概念,但曾想過這對於在我們將Mutex()鎖定內存部分。

采用與Wikipedia中所述相同的代碼,以下方法是否可以使用互斥鎖解決問題?

[注意:函數名稱並非特定於任何編程語言,只是為了簡單起見而使用]

處理器#1

mutex_lock(a)
while (f == 0);
print x;
mutex_unlock(a)

處理器#2

mutex_lock(a)
x = 42;
f = 1;
mutex_unlock(a)

內存屏障保證了在先指令的所有可見效果都可以在任何后續指令之前看到。 可能會重新排列觀察到的效果順序的事情是:

  • 編譯器(通過重新排序說明)
  • 管道混亂
  • 具有輕松的內存一致性的高速緩存系統(實際上在現代系統上都是如此)

互斥鎖可確保一次只有一個線程持有該互斥鎖。

這兩個概念之間存在關系:互斥鎖實際上是沒有用的,沒有至少部分內存障礙。 考慮以下示例:

mutex_lock(a);
x = x+1;
mutex_unlock(a);

鎖定操作必須至少具有一個“獲取”屏障,以防止x的負載在獲取鎖定之前出現。 同樣,“解鎖”操作必須至少具有“釋放”屏障,以防止x的存儲在釋放鎖定后出現。 就是說,鎖-解鎖對形成了一個籠子,操作無法逃脫。 (盡管有時程序員在重新排序時會感到驚訝,導致操作爬籠中!)

因此,鎖定互斥鎖並立即將其解鎖會成為內存屏障,盡管效率極低,因為它會強制執行串行。

內存條通常用於使功能混亂的流水線相對於其內存訪問進入定義良好的狀態,因此與互斥量的概念正交,互斥量的概念通常在多處理中是更高得多的概念(與CPU指令的亂序執行無關)。

互斥鎖和內核中的其他鎖在內部使用該屏障,以確保代碼按預期的正確順序運行。 在編譯器中使用優化時,您永遠不應假定將按照與源代碼中編寫的順序完全相同的順序執行指令。 編譯器可能會以優化寄存器使用方式的方式對匯編語言指令進行重新排序。 此外,現代CPU通常並行執行幾條指令,並且可能會重新排序內存訪問。 這些重新排序可以大大加快程序的速度。 但是會導致意外的輸出!

因此,MEMORY BARRIER原語可確保與放置在原語之前的C語句相對應的匯編語言指令不會被編譯器與對應於在原語之后的C語句所對應的匯編語言指令混合。 在linux barrier()中,宏為:

asm volatile("":::"memory")

這里是解釋:

  1. asm指令告訴編譯器插入匯編語言片段
  2. volatile關鍵字禁止編譯器將asm指令與程序的其他指令重新組合
  3. memory關鍵字強制編譯器假定RAM中的所有內存位置都已被匯編語言指令更改; 因此,編譯器無法通過在asm指令之前使用存儲在CPU寄存器中的內存位置的值來優化代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM