#Linux#進程間通信# 共享內存(shared memory)

共享內存(進程間最快通信):一般數據操作過程把數據從用戶態拷貝到內核態,用的時候,再將內核態拷貝到用戶態,但共享內存不需要這兩步,對虛擬地址空間的操作也就是操作了物理內存,那麼另一個虛擬地址空間也可以有這個數據,即不需要拷貝。因爲共享內存直接申請一塊物理內存通過頁表映射到虛擬地址空間中,操作虛擬地址空間,其實是操作同一塊物理內存區域,因此進行數據傳輸時相較於其他通信方 式,少了兩步用戶態與內核態數據拷貝的過程,因此共享內存是最快的進程間通信方式。

由於多個進程共享同一塊內存區域,必然需要某種用戶態同步機制,互斥鎖(進程間也可以有互斥鎖)和信號量,條件變量,讀寫鎖,文件鎖等都可以。爲了簡化共享數據的完整性和避免同時存取數據,內核提供了一種專門存取共享內存資源的機制。這稱爲互斥體或者mutex對象。

 

內存模型

在 Linux 系統中,每個進程的虛擬內存是被分爲許多頁面的。這些內存頁面中包含了實際的數據。每個進程都會維護一個從內存地址到虛擬內存頁面之間的映射關係。儘管每個進程都有自己的內存地址,不同的進程可以同時將同一個內存頁面映射到自己的地址空間中,從而達到共享內存的目的。使用一塊共享內存需要進行以下四個步驟:

  1. 進程必須首先分配一個新的共享內存塊會創建新的內存頁面。因爲所有進程都希望共享對同一塊內存的訪問,只應由一個進程創建一塊新的共享內存。再次分配一塊已經存在的內存塊不會創建新的頁面,而只是會返回一個標識該內存塊的標識符。

  2. 隨後需要訪問這個共享內存塊的每一個進程都必須將這個共享內存綁定到自己的地址空間中,創建一個從進程本身虛擬地址到共享頁面的映射關係。

  3. 當對共享內存的使用的進程結束之後,這個映射關係將被刪除。

  4. 再也沒有進程需要使用這個共享內存塊的時候,必須有一個(且只能是一個)進程負責釋放這個被共享的內存頁面即釋放該共享內存塊

 

共享內存(shared memory)也分System V標準與POSIX 標準,詳細參考

#Linux#進程間通信# System V標準&POSIX標準

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章