2014-03-05 48 views
2

我見過一些關於Linux內存障礙的文檔。它提到有讀取內存屏障和寫入內存屏障。我很容易理解寫入內存屏障的含義,我沒有看到讀取內存屏障的必要性!閱讀記憶障礙的含義是什麼?

只是爲了保持存儲區的讀取順序?如果順序相反,我認爲價值仍然是正確的,不是嗎?

因此,讀取內存屏障:讀取操作屏障讀取操作或寫入操作屏障讀取操作?

它讓我困惑!

回答

2

在讀取之前,讀取內存屏障強制讀取之前完成讀取。例如,使用內存映射I/O時,這非常有用,其中從內存中讀取的內容實際上是從連接到系統的某個設備讀取的。

MMIO讀取需要按程序順序執行,因爲它們可能對您正在讀取的設備有副作用。例如,如果設備正在傳輸數據,則讀取該值可能會導致設備將其替換爲新值。它也可能導致可能在不同的MMIO地點引發變化的行爲。因此,必須對這兩個位置進行讀取,因爲結果取決於它們執行的順序。

+0

MMIO應該是人民幣使用的一個很好的例子,thx! – Adambynes

1

即使讀取沒有副作用,有時必須訂購。考慮下面的語句:

extern some_flag_type message_is_ready_flag; 
extern some message_type message_data; 
while(message_is_ready_flag)  // First read 
    continue; 
... = message_data;    // Second read 

假設其他線程會寫第一個message_data,然後寫入message_is_ready_flag。

如果在上面的代碼中,第二次讀取首先發生,它可能不會讀取預期值。請注意,寫入線程需要使用相應的寫入器屏障。這就是爲什麼Linux文檔指出「閱讀障礙通常應該與書寫障礙配對」。