【Linux系統編程】進程間通訊--共享內存

     共享內存區域說白了就是多個進程共享的一塊物理內存地址,只是將這塊物理內存分別映射到自己的虛擬地址空間上。假設有10個進程將這塊區域映射到自己的虛擬地址上,那麼,這10個進程間就可以相互通訊。由於是同一塊區域在10個進程的虛擬地址上,當第一個進程向這塊共享內存的虛擬地址中寫入數據時,其他9個進程都會看到。但是進程之間使用這塊共享內存時,必須通過信號量做同步控制。管道和消息隊列由操作系統來控制,而共享內存需手動同步。

     API接口:

     int shmget((key_t)key,int sharedsize,int flag);//創建或獲取內核對象

     void* shmat(int shmid,const void* addr,int flag);//將進程中虛擬地址映射到指定內核對象開闢的物理內存上,並將虛擬地址返回

     int shmdt(void* addr);//將虛擬地址與共享內存區域斷開連接

     int shmctl(int shmid,int cmd,struct shmid_ds *buf);//共享內存的控制函數

     共享內存是最快的IPC(進程間通訊簡稱)原因:

     1.在通訊之前訪問內核對象時,需要用戶態切換內核態。但是當真正發送數據時,直接通過指針操作空間,不需要用戶態切換內核態。

     2.發送方可以直接通過指針將數據寫入共享內存區域,接收方直接通過指針操作共享內存區域的數據。相比管道、消息隊列少了兩次數據拷貝。

     命令:

     ipcs -m 查看共享內存

     ipcrm -m shmid 刪除共享內存

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