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

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

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

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

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

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

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

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

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

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

總結(jié):

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

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

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


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


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


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


分享到:
在線咨詢 我要報名
和我們在線交談!