首頁技術(shù)文章正文

C/C++經(jīng)典案例:Linux難點(diǎn)分析之共享內(nèi)存shm和mmap的比較

更新時(shí)間:2018-01-05 來源:黑馬程序員 瀏覽量:

共享內(nèi)存允許兩個(gè)或多個(gè)進(jìn)程共享一給定的存儲(chǔ)區(qū),因?yàn)閿?shù)據(jù)不需要來回復(fù)制,所以是最快的一種進(jìn)程間通信機(jī)制。共享內(nèi)存可以通過mmap()映射普通文件(特殊情況下還可以采用匿名映射)機(jī)制實(shí)現(xiàn),也可以通過系統(tǒng)V共享內(nèi)存機(jī)制實(shí)現(xiàn)。應(yīng)用接口和原理很簡(jiǎn)單,內(nèi)部機(jī)制復(fù)雜。為了實(shí)現(xiàn)更安全通信,往往還與信號(hào)燈等同步機(jī)制共同使用。

1. mmap的機(jī)制如:就是在磁盤上建立一個(gè)文件,每個(gè)進(jìn)程存儲(chǔ)器里面,單獨(dú)開辟一個(gè)空間來進(jìn)行映射。如果多進(jìn)程的話,那么不會(huì)對(duì)實(shí)際的物理存儲(chǔ)器(主存)消耗太大。

2. shm的機(jī)制:每個(gè)進(jìn)程的共享內(nèi)存都直接映射到實(shí)際物理存儲(chǔ)器里面。

mmap函數(shù)是unix/linux下的系統(tǒng)調(diào)用,來看《Unix Netword programming》卷二12.2節(jié)有詳細(xì)介紹。

mmap系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設(shè)計(jì)的。它本身提供了不同于一般對(duì)普通文件的訪問方式,進(jìn)程可以像讀寫內(nèi)存一樣對(duì)普通文件的操作。而Posix或系統(tǒng)V的共享內(nèi)存IPC則純粹用于共享目的,當(dāng)然mmap()實(shí)現(xiàn)共享內(nèi)存也是其主要應(yīng)用之一。

mmap系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問普通內(nèi)存一樣對(duì)文件進(jìn)行訪問,不必再 調(diào)用read(),write()等操作。mmap并不分配空間, 只是將文件映射到調(diào)用進(jìn)程的地址空間里, 然后你就可以用memcpy等操作寫文件, 而不用write()了.寫完后用msync()同步一下, 你所寫的內(nèi)容就保存到文件里了. 不過這種方式?jīng)]辦法增加文件的長(zhǎng)度, 因?yàn)橐成涞拈L(zhǎng)度在調(diào)用mmap()的時(shí)候就決定了.

簡(jiǎn)單說就是把一個(gè)文件的內(nèi)容在內(nèi)存里面做一個(gè)映像,內(nèi)存比磁盤快些。

總結(jié):

1、mmap有兩種方式,一種是映射內(nèi)存,它把普通文件映射為實(shí)際物理內(nèi)存頁,訪問它就和訪問物理內(nèi)存一樣(這也就和shm的功能一樣了)(同時(shí)不用刷新到文件)

2、mmap可以映射文件,不確定會(huì)不會(huì)像windows“內(nèi)存映射文件”一樣的功能,如果是,那么他就能映射好幾G甚至好幾百G的內(nèi)存數(shù)據(jù),對(duì)大數(shù)據(jù)處理將提供強(qiáng)大功能了。

3、shm只做內(nèi)存映射,和mmap第一個(gè)功能一樣!只不過不是普通文件而已,但都是物理內(nèi)存。


本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!


作者:黑馬程序員C/C++培訓(xùn)學(xué)院


首發(fā):http://c.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!