Firefox apache Windows 开源 mysql Android centos wordpress 云计算 Ubuntu 微软 java linux 编程 google shell php 程序员 Python nginx

Linux之进程的共享内存

 共享內存是在內存中開辟一段空間,供不同的進程訪問,與管道相比較,共享內存不僅能在多個不同進程間共享數據,而且可以比管道傳送更大量的數據。進程1和進程2可以訪問一塊共同的內存區域,並且在同一時刻可以讀寫共享的內存區域,

 共享內存在使用之前需要先創建,之後獲得共享內容的入口地址就可以對共享內存存操作了。不需要使用共享內存的時候,還可以在程序中分離共享內存。Linux為操作共享內存提供了幾個函數。

 shmget函數用來創建共享內存,參數key是由ftok函數生成的一個系統唯一的關鍵字,用來在系統中標識一塊內存,size參數制定需要的共享內存字節數,shmflg參數是內存的操作方式,有讀或者寫兩種。如果成功創建共享內存,函數會返回一個共享內存的ID。shmaddr參數指定了共享內存的地址,如果參數值為0.表示需要讓系統決定共享內存地址,如果獲取內存地址成功。則函數返回對應的共享內存地址。

 shmdt函數從程序中分離一塊共享內存,參數shmaddr標識了要分離的共享內存地址。

(1)第一個參數,shm_id是shmget函數返回的共享內存標識符。

(2)第二個參數,cmd是要采取的操作,它可以取下面的三個值 :    

IPC_STAT:把shmid_ds結構中的數據設置為共享內存的當前關聯值,即用共享內存的當前關聯值覆蓋shmid_ds的值。    

IPC_SET:如果進程有足夠的權限,就把共享內存的當前關聯值設置為shmid_ds結構中給出的值    

IPC_RMID:刪除共享內存段

(3)第三個參數,buf是一個結構指針,它指向共享內存模式和訪問權限的結構。 shmid_ds結構至少包括以下成員 
優點:我們可以看到使用共享內存進行進程間的通信真的是非常方便,而且函數的接口也簡單,數據的共享還使進程間的數據不用傳送,而是直接訪問內存,也加快了程序的效率。同時,它也不像匿名管道那樣要求通信的進程有一定的父子關系(system V版本共有)。

缺點:共享內存沒有提供互斥同步的機制,這使得我們在使用共享內存進行進程間通信時,往往要借助其他的手段比如信號量等來進行進程間的同步工作。

 

延伸阅读

  • 抱歉,暂无相关内容!

评论