c 共享記憶體通訊如何實現

2021-10-02 03:23:29 字數 1936 閱讀 8413

system v共享記憶體-對應cyber中xsisegment

參考鏈結

記憶體對映機制mmap是posix標準的系統呼叫,mmap()系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以向訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。一般說來,程序在對映空間的對共享內容的改變並不直接寫回到磁碟檔案中,往往在呼叫munmap(該呼叫在程序位址空間中解除乙個對映關係)後才執行該操作。可以通過呼叫msync實現磁碟上檔案內容與共享記憶體區的內容一致。

mmap用於共享記憶體有兩種使用方式,分別是使用普通檔案提供記憶體對映和使用特殊檔案提供匿名記憶體對映(適用於有親緣關係的程序之間)。下面分別介紹用法。

普通檔案對映的步驟(cyber中方法)

匿名對映實現共享記憶體

mmap的原理是在開啟乙個檔案時,如果發現page cache已經有相應的頁面則直接返回該位址供讀寫,這樣就能多個程序操作同一塊記憶體區域。

對mmap返回位址的訪問不完全取決於檔案被對映部分大小,因為linux中採用頁管理機制,所以對映檔案的記憶體大小一定是頁的整數倍,實際能訪問的大小是》=檔案被對映部分大小的。

mmap有乙個好處是當機器重啟,因為mmap把檔案儲存在磁碟上,這個檔案還儲存了作業系統同步的映像。mmap對映的記憶體不是持久化的,如果程序關閉,對映隨即失效,除非事先已經對映到了乙個檔案上。

系統呼叫mmap()通過對映乙個普通檔案實現共享記憶體。系統v則是通過對映特殊檔案系統shm中的檔案實現程序間的共享記憶體通訊。也就是說,每個共享記憶體區域對應特殊檔案系統shm中的乙個檔案。

程序間需要共享的資料被放在乙個叫做ipc共享記憶體區域的地方,所有需要訪問該共享區域的程序都要把該共享區域對映到本程序的位址空間中去。系統v共享記憶體通過shmget獲得或建立乙個ipc共享記憶體區域,並返回相應的識別符號。核心在保證shmget獲得或建立乙個共享記憶體區,初始化該共享記憶體區相應的shmid_kernel結構注同時,還將在特殊檔案系統shm中,建立並開啟乙個同名檔案,並在記憶體中建立起該檔案的相應dentry及inode結構,新開啟的檔案不屬於任何乙個程序(任何程序都可以訪問該共享記憶體區)。所有這一切都是系統呼叫shmget完成的。

該結構中最重要的乙個域應該是shm_file,它儲存了將被對映檔案的位址。每個共享記憶體區物件都對應特殊檔案系統shm中的乙個檔案,一般情況下,特殊檔案系統shm中的檔案是不能用read()、write()等方法訪問的,當採取共享記憶體的方式把其中的檔案對映到程序位址空間後,可直接採用訪問記憶體的方式對其訪問。

在建立了乙個共享記憶體區域後,還要將它對映到程序位址空間,系統呼叫shmat()完成此項功能。由於在呼叫shmget()時,已經建立了檔案系統shm中的乙個同名檔案與共享記憶體區域相對應,因此,呼叫shmat()的過程相當於對映檔案系統shm中的同名檔案過程,原理與mmap()大同小異。

下面以cyber中使用的步驟為例:

系統v共享記憶體中的資料,從來不寫入到實際磁碟檔案中去;而通過mmap()對映普通檔案實現的共享記憶體通訊可以指定何時將資料寫入磁碟檔案中。 系統v共享記憶體機制實際是通過對映特殊檔案系統shm中的檔案實現的,檔案系統shm的安裝點在交換分割槽上,系統重新引導後,所有的內容都丟失。

系統v共享記憶體是隨核心持續的,即使所有訪問共享記憶體的程序都已經正常終止,共享記憶體區仍然存在(除非顯式刪除共享記憶體),在核心重新引導之前,對該共享記憶體區域的任何改寫操作都將一直保留。

c/c++ 使用mmap/munmap函式分配記憶體

共享記憶體上,下

mmap對映區和shm共享記憶體的區別總結

C 使用共享記憶體實現程序間通訊

server完整原始碼 pragma region includes include include pragma endregion define map prefix l local define map name l samplemap define full map name map pre...

共享記憶體實現程序間通訊

1 物理檔案控制代碼 任何可以獲得的物理檔案控制代碼,如果你需要建立乙個物理檔案無關的記憶體對映也無妨,將它設定成為 0xffffffff invalid handle value 就可以了.如果需要和物理檔案關聯,要確保你的物理檔案建立的時候的訪問模式和 保護設定 匹配,比如 物理檔案唯讀,記憶體...

共享記憶體實現父子程序通訊

父程序在核心空間建立了乙個共享記憶體,通過fork函式,父子程序通過fork函式繼承了shmid,所以父子程序可以對核心中同乙個物件操作,剛開始父程序不斷往物件裡寫,然後開始發訊號sigusr1給子程序,讓子程序讀。對於子程序來說,剛開始睡眠,等待父程序寫,然後被核心喚醒,讀共享記憶體。此時父程序開...