共享內(nèi)存實現(xiàn)原理

mmap機制

在磁盤上建立一個文件,每個進程存儲器中,單獨開辟一個空間來映射保存到實際硬盤,實際并沒有反映到主存上。
使得進程之間通過映射同一個普通文件實現(xiàn)共享內(nèi)存,普通文件被映射到進程地址空間后,進程可以向訪問普通內(nèi)存一樣對文件進行訪問,不必再調(diào)用read(),write()等操作。

  • 優(yōu)點:存儲量大
  • 缺點:讀取和寫入速度比較慢
shm機制

每個進程的共享內(nèi)存都直接映射到實際物理存儲器上shm保存到物理存儲器(主存),實際的存儲量直接反映到主存上。
進程間需要共享的數(shù)據(jù)被放在一個叫做IPC共享內(nèi)存區(qū)域的地方,所有需要訪問該共享區(qū)域的進程都要把該共享區(qū)域映射到本進程的地址空間中去。

  • 優(yōu)點:進程間訪問速度比磁盤快
  • 缺點:存儲量不能非常大

通過shmget獲得或創(chuàng)建一個IPC共享內(nèi)存區(qū)域,并返回相應的標識符。
每一個共享內(nèi)存區(qū)都有一個控制結(jié)構(gòu)struct shmid_kernel。

主要API:shmget()、shmat()、shmdt()及shmctl()。

  • shmget()用來獲得共享內(nèi)存區(qū)域的ID,如果不存在指定的共享區(qū)域就創(chuàng)建相應的區(qū)域。
    int shmget(key_t key,size_t size,int shmflg);
    key:共享內(nèi)存鍵值,可以理解為共享內(nèi)存的唯一性標記。
    size:共享內(nèi)存大小
    shmflag:創(chuàng)建進程和其他進程的讀寫權(quán)限標識。
    返回值:相應的共享內(nèi)存標識符,失敗返回-1

  • shmat()把共享內(nèi)存區(qū)域映射到調(diào)用進程的地址空間中去,這樣,進程就可以方便地對共享區(qū)域進行訪問操作。
    void *shmat(int shm_id,const void *shm_addr,int shmflg);
    shm_id:共享內(nèi)存標識符
    shm_addr:指定共享內(nèi)存連接到當前進程的地址,通常為0,表示由系統(tǒng)來選擇。
    shmflg:標志位
    返回值:指向共享內(nèi)存第一個字節(jié)的指針,失敗返回-1

  • shmdt()調(diào)用用來解除進程對共享內(nèi)存區(qū)域的映射。

  • shmctl實現(xiàn)對共享內(nèi)存區(qū)域的控制操作。
    int shmctl(int shm_id,int command,struct shmid_ds *buf);
    shm_id:共享內(nèi)存標識符
    command: 有三個值
    IPC_STAT:獲取共享內(nèi)存的狀態(tài),把共享內(nèi)存的shmid_ds結(jié)構(gòu)復制到buf中。
    IPC_SET:設(shè)置共享內(nèi)存的狀態(tài),把buf復制到共享內(nèi)存的shmid_ds結(jié)構(gòu)。
    IPC_RMID:刪除共享內(nèi)存
    buf:共享內(nèi)存管理結(jié)構(gòu)體。

ps:Python開啟多進程使用的是multiprocessing,進程傳遞了一個multiprocessing.Queue,使用的是shm共享內(nèi)存機制。multiprocessing模塊Value Array是基于mmap實現(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容