程序間資料共享 檔案與記憶體的對映

2021-08-20 14:24:23 字數 2746 閱讀 8521

程序間資料共享--檔案與記憶體的對映

在執行strace  -c nginx的時候,我們可以看出mmap、mprotect和munmap使用的比例是很高的。因此可以看出nginx執行的時候有很大一部分時間在處理檔案與記憶體之間的對映。

mmap在呼叫程序的虛擬位址空間中建立乙個新的對映。

#include

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

addr:新對映的起始位址。如果addr為null,那麼核心會選擇建立對映的位址;這是建立新對映的最方便的

方法。如果addr不是null,那麼核心將它作為提示對映位置的提示;在linux上,對映將在附近的頁面邊界

建立。作為呼叫的結果,新對映的位址被返回。

length:對映的長度。檔案對映的內容使用檔案描述符fd引用的檔案中的偏移量offset開始的長度位元組進

行初始化。

prot:引數描述對映所需的記憶體保護(並且不得與檔案的開啟模式衝突)。 它是prot_none或乙個或多個

的按位或,具體標誌如下所示:

prot_exec頁可能會被執行。

prot_read頁可能被讀取。

prot_write頁可以寫入。

prot_none頁可能無法訪問。

offset:必須是由sysconf(_sc_page_size)返回的頁面大小的倍數。

flags:引數確定對對映的更新對對映同一區域的其他程序是否可見,以及是否將更新傳遞到底層檔案。常用

的flags如下:

map_shared

和其他程序共享這個對映。 對映的更新對對映此檔案的其他程序可見,並傳遞到底層檔案。 在呼叫

msync(2)或munmap()之前,檔案可能不會實際更新。

map_private

建立乙個私人寫時拷貝對映。 對對映的更新對對映相同檔案的其他程序不可見,並且不會傳遞到底層

檔案。 沒有指定在對映區域中是否可見mmap()呼叫後

對檔案所做的更改。

int munmap(void *addr, size_t length);

munmap()系統呼叫會刪除指定位址範圍的對映。 該程序終止時,該區域也會自動取消對映。 另一方面,關閉檔案描述

符不會取消對映該區域。

位址addr必須是頁面大小的倍數。 包含部分指定範圍的所有頁面都未對映,隨後對這些頁面的引用將生成sigsegv。 如

果指定的範圍不包含任何對映頁面,則不是錯誤。

int mprotect(void *addr, size_t len, int prot);

mprotect為包含區間[addr,addr + len-1]中位址範圍的任何部分的呼叫程序的記憶體頁面更改保護。 

addr必須與頁面邊界對齊。

如果呼叫程序試圖以違反保護的方式訪問記憶體,那麼核心會為該程序生成乙個sigsegv訊號。

prot是prot_none或按位或以下列表中的其他值:

prot_none記憶體根本無法訪問。

prot_read可以讀取記憶體。

prot_write可以修改記憶體。

prot_exec可以執行記憶體。

#include #include #include #include #include #include #include #include #include #include #define file_mode       (s_irusr | s_iwusr | s_irgrp | s_iroth)

#define dir_mode (file_mode | s_ixusr | s_ixgrp | s_ixoth)

int main(int argc, char *argv)

if ((fdin = open(argv[1], o_rdonly)) < 0)

if ((fdout = open(argv[2], o_rdwr | o_creat | o_trunc, file_mode)) < 0)

if (fstat(fdin, &sbuf) < 0)

//設定目標檔案的長度

if (ftruncate(fdout, sbuf.st_size) < 0)

//迴圈從原檔案讀取檔案內容,並複製到目標內容

while (fsz < sbuf.st_size)

//設定目標檔案對映

if ((dst = mmap(0, copysz, prot_read,map_shared, fdout, fsz)) == map_failed)

//修改目標檔案對映的許可權,否則程式報sigsegv中斷

if(mprotect(dst, copysz, prot_write)!=0)

//拷貝檔案

memcpy(dst, src, copysz);

munmap(src, copysz);

munmap(dst, copysz);

fsz += copysz;

}exit(0);

}

[1].  

[2].  

資料共享,記憶體對映檔案和虛擬記憶體,共享記憶體

記憶體對映檔案允許開發人員預定一塊位址空間區域並給區域調撥物理儲存器。記憶體對映檔案的物理儲存器來自磁碟已有的檔案,而不是來自系統的頁交換檔案。一旦把檔案對映到位址空間,就可以對它進行訪問,就好像整個檔案都已經被載入記憶體一樣。不必再對檔案執行i o操作。使用記憶體對映檔案來顛倒檔案內容時,先開啟檔...

記憶體對映檔案與SendMessage程序間通訊寫寫

才寫完了作業,碰到了一些問題,也學會了很多,寫出來總結下,也讓碰到此問題的人有個答案。在寫之前剛剛看打了 2010中國大學創業富豪榜 有的才26,突然覺得很失落。好了,不管那了,進正題。此次的作業主要是利用記憶體對映檔案技術,實現如顯示,寫入,程序間共享等。先解釋記憶體對映檔案,如果說的不那麼專業的...

記憶體對映檔案實現共享記憶體

記憶體對映檔案程序間共享記憶體 記憶體對映檔案的另乙個功能是在程序間共享資料,它提供了不同程序共享記憶體的乙個有效 且簡單的方法。後面的許多例子都要用到共享記憶體。共享記憶體主要是通過對映機制實現的。windows 下程序的位址空間在邏輯上是相互隔離的,但在物理上卻是重疊的。所謂的重 對映檔案物件時...