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

mmap機(jī)制

在磁盤上建立一個(gè)文件炼彪,每個(gè)進(jìn)程存儲(chǔ)器中,單獨(dú)開辟一個(gè)空間來(lái)映射保存到實(shí)際硬盤正歼,實(shí)際并沒(méi)有反映到主存上辐马。
使得進(jìn)程之間通過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存,普通文件被映射到進(jìn)程地址空間后局义,進(jìn)程可以向訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn)喜爷,不必再調(diào)用read(),write()等操作萄唇。

  • 優(yōu)點(diǎn):存儲(chǔ)量大
  • 缺點(diǎn):讀取和寫入速度比較慢
shm機(jī)制

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

  • 優(yōu)點(diǎn):進(jìn)程間訪問(wèn)速度比磁盤快
  • 缺點(diǎn):存儲(chǔ)量不能非常大

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

主要API:shmget()拔妥、shmat()、shmdt()及shmctl()达箍。

  • shmget()用來(lái)獲得共享內(nèi)存區(qū)域的ID没龙,如果不存在指定的共享區(qū)域就創(chuàng)建相應(yīng)的區(qū)域。
    int shmget(key_t key,size_t size,int shmflg);
    key:共享內(nèi)存鍵值幻梯,可以理解為共享內(nèi)存的唯一性標(biāo)記兜畸。
    size:共享內(nèi)存大小
    shmflag:創(chuàng)建進(jìn)程和其他進(jìn)程的讀寫權(quán)限標(biāo)識(shí)努释。
    返回值:相應(yīng)的共享內(nèi)存標(biāo)識(shí)符碘梢,失敗返回-1

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兄朋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怜械,更是在濱河造成了極大的恐慌颅和,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕允,死亡現(xiàn)場(chǎng)離奇詭異峡扩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灼芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門有额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事巍佑≤钋ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵萤衰,是天一觀的道長(zhǎng)堕义。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脆栋,這世上最難降的妖魔是什么倦卖? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮椿争,結(jié)果婚禮上怕膛,老公的妹妹穿的比我還像新娘。我一直安慰自己秦踪,他們只是感情好褐捻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椅邓,像睡著了一般柠逞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上景馁,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天板壮,我揣著相機(jī)與錄音,去河邊找鬼合住。 笑死绰精,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聊疲。 我是一名探鬼主播茬底,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼获洲!你這毒婦竟也來(lái)了阱表?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贡珊,失蹤者是張志新(化名)和其女友劉穎最爬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體门岔,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爱致,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寒随。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠悯。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帮坚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出互艾,到底是詐尸還是另有隱情试和,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布纫普,位于F島的核電站阅悍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昨稼。R本人自食惡果不足惜节视,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望假栓。 院中可真熱鬧寻行,春花似錦、人聲如沸但指。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棋凳。三九已至,卻和暖如春连躏,著一層夾襖步出監(jiān)牢的瞬間剩岳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工入热, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拍棕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓勺良,卻偏偏與公主長(zhǎng)得像绰播,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚困,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354