在多核系統(例如2,4,8核)中,我們通常使用互斥鎖和信號量來訪問共享內存。但是,我可以預見,這些方法會爲未來具有多個內核的系統帶來很高的開銷。有沒有其他方法可以更好地爲將來的許多核心繫統訪問共享內存。在許多核心繫統中如何訪問共享內存
回答
我不確定將來你想走多遠。但是從長遠來看,我們現在所知道的共享內存(任何內核都可以訪問的單個地址空間)是不可擴展的。因此,編程模型將不得不在某些時候改變,讓程序員的生活變得更加艱難,就像我們進入多核時一樣。
但是現在(也許再過10年),你可以逃避事務內存和其他硬件/軟件技巧。
從長遠來看,我說共享內存不可擴展的原因僅僅是由於物理原因。 (類似於單核/高頻如何擊中障礙)
總之,晶體管不能縮小到小於原子的大小(禁止使用新技術),並且信號傳播速度不能超過光速。因此,內存將變得越來越慢(相對於處理器),並且在某些時候,共享內存變得不可行。
我們現在可以在多套接字系統上看到NUMA的效果。大型超級計算機既不共享內存,也不兼容緩存。
Transactional memory就是這樣一種方法。
1)只鎖定你正在訪問的內存部分,而不是整個表!這是在大型哈希表的幫助下完成的。桌子越大,鎖定機制越好。 2)如果可以,只鎖定寫入,而不是讀取(這要求在更新時讀取「先前值」時沒有問題,這通常是有效的情況)。
在任何多處理器/內核/線程應用程序同步中訪問最低級別的共享內存取決於總線鎖定。這樣的鎖可能會導致數百個(CPU)等待狀態,因爲它還包含鎖定那些具有總線主控設備(包括DMA)的I/O總線。理論上可以設想一箇中級鎖,當程序員確定存儲區被鎖定時不會受到任何I/O總線的影響時,可以調用該鎖。這樣的鎖定會更快,因爲它只需要將CPU緩存與主存儲器同步快速,至少與最慢的I/O總線的延遲相比。一般來說,程序員是否有能力決定何時使用哪種總線鎖定令其令人擔憂的主要可行性影響。這種鎖也可能需要其自己的專用外部引腳與其他處理器同步。
在多處理器Opteron系統中,每個處理器都有自己的內存,它成爲所有安裝的處理器可以「看到」的整個內存的一部分。試圖訪問內存的處理器將被連接到另一個處理器上,透明地通過高速互連總線(稱爲HyperTransport)向負責該內存的處理器(NUMA概念)完成訪問(儘管速度更慢)。只要處理器及其內核與物理連接的內存一起工作,處理速度就會很快。另外,許多處理器都配備了幾條外部存儲器總線,以增加其整體存儲器帶寬。
在Opteron系統上可以使用HyperTransport互連來實現理論中級鎖定。
至於任何可預見的未來,鎖定儘可能少且時間儘可能短的經典方法是,通過實現鎖定到位時使用的高效算法(以及相關的數據結構)仍然成立。
- 1. 在Android上訪問系統共享庫
- 2. OpenCL-共享內存訪問
- 3. 如何在Linux系統中創建/訪問共享文件夾?
- 4. 在Ubuntu系統上共享核心的進程
- 5. iOS共享分機 - 如何訪問核心數據
- 6. 共享內存,MPI和排隊系統
- 7. 如何在多個內核和多個GPU中共享全局內存?
- 8. 如何完全在多核系統上預留核心?
- 9. 從操作系統內核訪問GPU內存
- 10. 如何共享對FAT32文件系統的訪問
- 11. 核心數據中的許多關係
- 12. gdb核心無法訪問內存
- 13. 備份/共享核心數據存儲
- 14. unix-like操作系統如何實現IPC共享內存?
- 15. 如何訪問系統公共目錄
- 16. Multicores:同時訪問共享內存
- 17. 無法訪問共享內存
- 18. 訪問控制共享內存
- 19. Node.js線程共享內存訪問
- 20. 跨線程共享內存訪問
- 21. 原子訪問共享內存
- 22. 訪問共享內存同步
- 23. 共享和全局內存訪問
- 24. 如何跨多個EJB共享Java緩存系統(JCS)資源
- 25. Solr字段類型如何在多個核心之間共享?
- 26. 如何在多個用戶之間共享核心數據?
- 27. 如何訪問共享內存中的變量
- 28. 共享內存矩陣乘法內核
- 29. 如何確定我的操作系統是共享內存的多平臺
- 30. 如何最好地同步在內核和用戶空間之間共享的內存訪問,在Windows中
但它很慢,不是嗎?那裏最快的實施是什麼? – MetallicPriest
此頁面也可能有助於獲得更多信息:http://www.haskell.org/haskellwiki/Software_transactional_memory –
@MetallicPriest - 它目前速度較慢,但這似乎部分歸因於核心數量較少,但是,鎖定方法,以及它是多麼新,它仍然可能是目前最好的方法。 –