Shared memory共享內(nèi)存
計(jì)算機(jī)科學(xué)中,共享內(nèi)存是指可以被多個程序同時訪問的內(nèi)存,目的是提供程序之間的通信或避免冗余拷貝。共享內(nèi)存是程序之間傳遞數(shù)據(jù)的有效手段。根據(jù)上下文,程序可能在一個處理器上運(yùn)行,也可能在多個獨(dú)立的處理器上運(yùn)行。
在單個程序內(nèi)部使用內(nèi)存進(jìn)行通信,例如在其多個線程之間,也被稱為共享內(nèi)存。
三個處理器的共享內(nèi)存系統(tǒng)
1??????在硬件方面
在計(jì)算機(jī)硬件中,共享內(nèi)存指的是多處理器計(jì)算機(jī)系統(tǒng)中可以被多個不同的中央處理單元(CPU)訪問的隨機(jī)存取內(nèi)存(RAM)塊。
共享內(nèi)存系統(tǒng)可以使用:
1.?????????統(tǒng)一內(nèi)存訪問(UMA):所有的處理器統(tǒng)一共享物理內(nèi)存。
2.?????????非統(tǒng)一內(nèi)存訪問(NUMA):內(nèi)存訪問時間取決于相對于處理器的內(nèi)存位置。
3.?????????高速緩沖存儲器架構(gòu)(COMA):每個節(jié)點(diǎn)上處理器的本地存儲器被用作高速緩沖存儲器,而不是實(shí)際的主存儲器。
共享內(nèi)存系統(tǒng)相對來說比較容易編程,因?yàn)樗械奶幚砥鞫脊蚕硪粋€數(shù)據(jù)視圖,處理器之間的通信可以像訪問同一位置的內(nèi)存一樣快。共享內(nèi)存系統(tǒng)的問題是,許多CPU需要快速訪問內(nèi)存,很可能會緩存內(nèi)存,這有兩個復(fù)雜的問題:
1.?????????訪問時間退化:當(dāng)幾個處理器試圖訪問同一個內(nèi)存位置時,會引起爭奪。試圖訪問附近的內(nèi)存位置可能會導(dǎo)致錯誤的共享。共享內(nèi)存計(jì)算機(jī)不能很好地?cái)U(kuò)展。一般支持10個以內(nèi)的處理器。
2.?????????缺乏數(shù)據(jù)連貫性:每當(dāng)一個緩存更新了可能被其他處理器使用的信息時,需要將變化反映給其他處理器,否則不同的處理器將使用不連貫的數(shù)據(jù)工作。這樣的緩存一致性協(xié)議在工作良好的情況下,可以為多個處理器之間的共享信息提供極其高性能的訪問。另一方面,它們有時會過載,成為性能的瓶頸。
交叉式交換機(jī)、Omega網(wǎng)絡(luò)、HyperTransport或前端總線等技術(shù)可用于抑制瓶頸效應(yīng)。
如果是異構(gòu)系統(tǒng)架構(gòu)(整合了不同類型的處理器,如CPU和GPU,共享內(nèi)存的處理器架構(gòu)),CPU的內(nèi)存管理單元(MMU)和GPU的輸入輸出內(nèi)存管理單元(IOMMU)必須共享某些特性,如共享地址空間。
HSA定義了一種特殊的內(nèi)存共享情況,即CPU的MMU和GPU的IOMMU有一個相同的可翻頁的虛擬地址空間。
共享內(nèi)存的替代方案是分布式內(nèi)存和分布式共享內(nèi)存,它們都有一系列類似的問題。
2??????軟件方面
在計(jì)算機(jī)軟件中,共享內(nèi)存是指:
1.?????????進(jìn)程間通信(IPC)的一種方法,即同時運(yùn)行的程序之間交換數(shù)據(jù)的一種方式。一個進(jìn)程會在RAM中創(chuàng)建一個區(qū)域,其他進(jìn)程可以訪問。
2.?????????一種節(jié)約內(nèi)存空間的方法,通過使用虛擬內(nèi)存映射或在相關(guān)程序的明確支持下,將通常是數(shù)據(jù)副本的訪問引導(dǎo)到單個實(shí)例上。這種方法最常用于共享庫和原地執(zhí)行(XIP)。
由于兩個進(jìn)程都可以像訪問普通工作內(nèi)存一樣訪問共享內(nèi)存區(qū)域,所以這是一種非常快速的通信方式(與命名管道、Unix域套接字或CORBA等其他IPC機(jī)制相比)。另一方面,它的可擴(kuò)展性較差,例如通信進(jìn)程必須運(yùn)行在同一臺機(jī)器上(在其他IPC方法中,只有Internet域套接字--而不是Unix域套接字--可以使用計(jì)算機(jī)網(wǎng)絡(luò)),而且如果共享內(nèi)存的進(jìn)程運(yùn)行在不同的CPU上,而且底層架構(gòu)不具有緩存一致性,必須注意避免出現(xiàn)由此引起的問題。
例如,通過共享內(nèi)存的IPC用于Unix系統(tǒng)中應(yīng)用程序和X服務(wù)器之間的圖像傳輸,或者在Windows下COM庫中CoMarshalInterThreadInterfaceInStream返回的IStream對象內(nèi)。
動態(tài)庫一般只在內(nèi)存中保存一次,并映射到多個進(jìn)程中,只有那些必須為各個進(jìn)程定制的頁面才會被復(fù)制,通常采用一種稱為copy-on-write的機(jī)制,在嘗試寫的時候透明地復(fù)制頁面,然后成功的寫在私有副本上。
2.1????支持類Unix系統(tǒng)
POSIX提供了一個使用共享內(nèi)存的標(biāo)準(zhǔn)化API,即POSIX Shared Memory。這使用了sys/mman.h中的函數(shù)shm_open。POSIX進(jìn)程間通信(POSIX:XSI擴(kuò)展的一部分)包括共享內(nèi)存函數(shù)shmat、shmctl、shmdt和shmget。這使用了sys/shm.h中的shmget。BSD系統(tǒng)提供了?"匿名映射內(nèi)存",可以被多個進(jìn)程使用。
shm_open創(chuàng)建的共享內(nèi)存是持久的。它一直留在系統(tǒng)中,直到被進(jìn)程明確刪除。這有一個缺點(diǎn),就是如果進(jìn)程崩潰并且沒有清理共享內(nèi)存,它就會一直存在,直到系統(tǒng)關(guān)閉。
POSIX還提供了mmap API,用于將文件映射到內(nèi)存中;映射可以被共享,允許文件的內(nèi)容作為共享內(nèi)存使用。
基于2.6內(nèi)核和更高版本的Linux發(fā)行版以RAM磁盤的形式提供/dev/shm作為共享內(nèi)存,更確切地說,是作為一個公開可寫目錄(系統(tǒng)的每個用戶都可以在其中創(chuàng)建文件的目錄),存儲在內(nèi)存中。基于RedHat和Debian的發(fā)行版都默認(rèn)包含了它。在內(nèi)核配置文件中,對這種類型的RAM磁盤的支持是完全可選的。
2.2????對Windows的支持
在Windows上,可以使用CreateFileMapping和MapViewOfFile函數(shù)在多個進(jìn)程中把文件的某個區(qū)域映射到內(nèi)存中。
2.3????跨平臺支持
一些C++庫提供了可移植和面向?qū)ο蟮脑L問共享內(nèi)存功能。例如,Boost包含Boost.Interprocess C++庫,Qt提供了QSharedMemory類。
2.4????編程語言支持
除了C/C++之外,編程語言中也有對共享內(nèi)存的本地支持。例如,PHP提供了一個創(chuàng)建共享內(nèi)存的API,類似于POSIX函數(shù)。
3??????參考
https://en.wikipedia.org/wiki/Shared_memory
https://www.geeksforgeeks.org/ipc-shared-memory/
https://apiacoa.org/teaching/big-data/smp.en.html
https://www.tutorialspoint.com/inter_process_communication/inter_process_communication_shared_memory.htm
https://opensource.com/article/19/4/interprocess-communication-linux-storage
https://www.it.uu.se/edu/course/homepage/os2/st10/handout-03b.pdf
Windows Linux
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。