2009-03-02 49 views
1

保護標誌是否影響進程之間的共享?如果我有PROT_READ | PROT_WRITE - 受保護的mmapped內存區域,只要我沒有寫入內存區域,它仍然是完全共享的?mmap保護標誌對進程之間共享的影響

int prot = PROT_READ|PROT_EXEC; 
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0); 

VS:

int prot = PROT_READ|PROT_WRITE|PROT_EXEC; 
image = mmap(...) 

我願意做小的修改對內存區域的一小部分,我映射,然後重新mprotect的這一切後,因爲它比簡單mprotecting當我需要這樣做的時候,一小部分。

現在的問題是,它是否最終會迫使每個進程複製整個文件,或僅僅是每個進程修改的部分?

回答

1

根據最近Linux系統上的mmap(2)手冊頁,MAP_PRIVATE使用copy-on-write(COW)分配內存。這意味着,除非您對其進行更改,否則您的記憶將不會被複制。因爲COW是實現這一點的有效方法,所以我認爲在其他* NIX系統中也是這樣做的。

mmap的內存以相同大小的塊組織,即所謂的頁面。內存將始終以頁面大小的倍數(即整個頁面)進行映射。每個頁面可以獨立交換。所以如果你爲這個mmap化的內存範圍寫了一些東西,至少只有一個頁面必須被複制。

頁面大小取決於您的系統,在x86上它通常是4096字節。如果您對系統的頁面大小感興趣,可以使用sysconf(3)

#include <unistd.h> 
    long pagesize = sysconf(_SC_PAGESIZE); 

你從MMAP得到(指針)將已經指向的頁面大小的倍數,你應該通過的mprotect()地址對齊到一個頁面邊界。