【操作系統】 爲什麼說共享內存是最快的一種IPC方式呢?

在linux進程間通信的方式中,共享內存是一種最快的IPC方式。因此,共享內存用於實現進程間大量的數據傳輸,共享內存的話,會在內存中單獨開闢一段內存空間,這段內存空間有自己特有的數據結構,包括訪問權限、大小和最近訪問的時間等。

爲什麼說共享內存是最快的一種IPC方式呢?讓我們一起來看一下下面的這張圖:

在這裏插入圖片描述
從這張圖中,我們可以看出,使用管道(FIFO/消息隊列)從一個文件傳輸信息到另外一個文件需要複製4次。一是,服務器端將信息從相應的文件複製到server臨時緩衝區中;二是,從臨時緩衝區中複製到管道(FIFO/消息隊列);三是,客戶端將信息從管道(FIFO/消息隊列)複製到client端的緩衝區中;四是,從client臨時緩衝區將信息複製到輸出文件中。

這個是對於不是共享內存的其他方式的消息傳送過程,下面我們仔細來看一下對於共享內存而言,這種消息傳送機制是怎樣的呢?我們還是先看一下下面這張圖:
在這裏插入圖片描述
從這張圖中,我們可以看出,共享內存的消息複製只有兩次。一是,從輸入文件到共享內存;二是,從共享內存到輸出文件。這樣就很大程度上提高了數據存取的效率。

它將同一塊內存區域映射到共享它的不同進程的地址空間中,使得這些進程間的通信就不需要再經過內核,只需對該共享的內存區域進程操作就可以了,但是它需要用戶自己進行同步操作。

共享內存與mmap

Linux下的內存是採用頁式管理機制,通過mmap進行內存映射,內核生成的映射區的大小都是以頁面大小PAGESIZE爲單位,即爲PAGESIZE的整數倍。

注意mmap的映射大小,不能超過文件大小。有人實驗過的。如果超過了,寫是照寫,但是文件中沒有,另外的進程讀不出來。

API
int shmget(key_t key, size_t size, int shmflg);  
void *shmat(int shm_id, const void *shm_addr, int shmflg); 
int shmdt(const void *shmaddr);  
int shmctl(int shm_id, int command, struct shmid_ds *buf); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章