偽共享
佇電腦科學當中,偽共享(英語:False sharing)是一種會致使效能下降的使用模式,伊可能出現佇具有分散式緊取經維持緊取一致性的系統中。當系統參與者試定期存取無予另外一方更改的資料,但是欲儉的資料佮正被人更加改的另外一个資料共享仝一緊取塊的時陣,緊取協定可能會強制第一个參與者重新載入規个緊取塊,就算講佇邏輯遮爾做是無必要的。緊取系統毋知影這塊內的活動,所以這強制第一个參與者承擔資源的伊真共享存取(true shared access)伊需要的緊取系統開銷。
加處理器 CPU 緊取
目前為止,該術語上捷看的用法是佇現代加處理器 CPU 緊取中,其中記憶體以二的較細的冪個字(比如講,六十四个對齊、連紲的位元組)為單位的緊取行的形式進行高速緩衝記持體。若準兩个處理器對仝一記憶體位址區域內底會當儉佇單行的獨立資料進行操作,系統中的高速緩衝記持體一致性機制可能逐改資料寫入時陣攏愛共整行資料通過匯流排抑是互相傳輸,除了浪費系統誠闊以外,猶引發記憶體停頓。佇某一寡狀況下,消除偽共享會當帶來若干焦量級的效能改進。偽共享是自動同步緊取協定的原生產物,就算也有可能存在佇咧分散式檔案系統或者是資料庫等等的環境內底,但目前是干焦佇咧 RAM 緊號中央較捷看著。
例
此 C + + 二十代碼顯示矣偽共享的影響。shared \ _ or \ _ not 的頭一个成員 a 始終對齊到強欲取行的開頭,用防止資料結構迒過真緊會當,對造成 a 和 b 予意外拆分,煞無法度演示偽共享的效果。第二个成員 b 攏囥佇仝一个緊取行的 a 了後,抑是佇後一个緊取行上對齊,具體攏著愛看 FALSE \ _ SHARING 設定做 true 抑是 false。若是 FALSE \ _ SHARING 設定做 false,代碼執行速度通常會快幾若倍。
解措施
有一寡方法會當來緩解偽共享的影響。比如講,會當通過重新排序變數抑是佇變數之間添加添充(未來使用的位元組)來防止 CPU 緊取著的偽共享。猶毋過,其中一寡閣較改可能會增加物件的大細,顛倒致使記憶體使用量增加。編譯時資料轉換嘛會當轉解偽共享。毋過,其中一寡轉換可能並無總是予人允准的。比如講,C + + 二十三的 C + + 程式語言標準草案要求對資料成員進行布局的時陣著愛使後壁的成員有閣較懸的成員。
市面上已經有檢測偽共享的工具。閣有一寡系統會當檢測佮修復執行程式內底的偽共享。毋過,𪜶遮的系統會產生一寡執行開銷。
參考資料
外部連結
- Easy Understanding on False Sharing
- C + + today blog , False Sharing hits again !
- Dr Dobbs article : Eliminate False Sharing
- Be careful when trying to eliminate false sharing in Java