更新時間:2018-01-05 來源:黑馬程序員 瀏覽量:
共享內存允許兩個或多個進程共享一給定的存儲區(qū),因為數(shù)據(jù)不需要來回復制,所以是最快的一種進程間通信機制。共享內存可以通過mmap()映射普通文件(特殊情況下還可以采用匿名映射)機制實現(xiàn),也可以通過系統(tǒng)V共享內存機制實現(xiàn)。應用接口和原理很簡單,內部機制復雜。為了實現(xiàn)更安全通信,往往還與信號燈等同步機制共同使用。
1. mmap的機制如:就是在磁盤上建立一個文件,每個進程存儲器里面,單獨開辟一個空間來進行映射。如果多進程的話,那么不會對實際的物理存儲器(主存)消耗太大。
2. shm的機制:每個進程的共享內存都直接映射到實際物理存儲器里面。
mmap函數(shù)是unix/linux下的系統(tǒng)調用,來看《Unix Netword programming》卷二12.2節(jié)有詳細介紹。
mmap系統(tǒng)調用并不是完全為了用于共享內存而設計的。它本身提供了不同于一般對普通文件的訪問方式,進程可以像讀寫內存一樣對普通文件的操作。而Posix或系統(tǒng)V的共享內存IPC則純粹用于共享目的,當然mmap()實現(xiàn)共享內存也是其主要應用之一。
mmap系統(tǒng)調用使得進程之間通過映射同一個普通文件實現(xiàn)共享內存。普通文件被映射到進程地址空間后,進程可以像訪問普通內存一樣對文件進行訪問,不必再 調用read(),write()等操作。mmap并不分配空間, 只是將文件映射到調用進程的地址空間里, 然后你就可以用memcpy等操作寫文件, 而不用write()了.寫完后用msync()同步一下, 你所寫的內容就保存到文件里了. 不過這種方式沒辦法增加文件的長度, 因為要映射的長度在調用mmap()的時候就決定了.
簡單說就是把一個文件的內容在內存里面做一個映像,內存比磁盤快些。
總結:
1、mmap有兩種方式,一種是映射內存,它把普通文件映射為實際物理內存頁,訪問它就和訪問物理內存一樣(這也就和shm的功能一樣了)(同時不用刷新到文件)
2、mmap可以映射文件,不確定會不會像windows“內存映射文件”一樣的功能,如果是,那么他就能映射好幾G甚至好幾百G的內存數(shù)據(jù),對大數(shù)據(jù)處理將提供強大功能了。
3、shm只做內存映射,和mmap第一個功能一樣!只不過不是普通文件而已,但都是物理內存。
本文版權歸黑馬程序員C/C++學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:黑馬程序員C/C++培訓學院
首發(fā):http://c.itheima.com/