文件空間映射mmap()函數(是什么,為什么,怎么用)
1、mmap()函數用來將文件或者設備映射到內存中。
2、mmap的特點是按需調頁。最開始只申請vma,并不調真正的頁。當對某些頁進行引用的時候,會引起一個缺頁中斷,再將頁面調入到內存當中,這樣避免了對內存的浪費。
mmap的優勢: 操作文件就像操作內存一樣,適合于對較大文件的讀寫。
mmap的缺點:
1、文件如果很小,比如60bytes,由于在內存當中的組織都是按頁組織的,將文件調入到內存當中是一個頁4k,這樣其他的4096-60=4036 bytes的內存空間就會浪費掉了。
2、而且文件無法完成拓展,因為mmap到內存的時候,你所能夠操作的范圍就確定了,無法增加文件的長度。
3、如果系統頻繁的使用mmap操作,而且每次mmap的size都不同,那么就會使得內存可能缺少足夠的連續的內存空間。
那又怎么了,人家就是用來操作大型數據的。
當mmap的文件是page size的整數倍的時候,使用mmap調用看起來是最合適的,不會造成浪費。
你用其他方式來進行大量數據傳遞簡直不理智。
1、開啟文件空間映射函數mmap()
#include
1
2
3
4
5
6
7
參數釋義:
start:用戶所要映射的目的地址,一般放NULL,讓系統自己去找。
length:顧名思義。
prot:映射區保護方式,取值范圍
{
PROT_EXEC:映射區可執行
PROT_READ:映射區可讀取
PROT_WRITE:映射區可寫入
PROT_NONE:映射區不可存取
}
如果要幾個功能合在一起,用管道符 | 連通
當然,權限最高的還是映射的文件,如果被映射文件不讓讀,那就沒辦法讀。
flags:對映射對象的配置
{
MAP_FIXED:一般不用
MAP_SHARED:共享映射區
MAP_PRIVATE:讀時共享,寫時復制,對映射區的操作不會對原文件造成影響
MAP_ANONYMOUS:建立匿名映射,不涉及文件,所以用不到fd,也不允許與其他進程共享
MAP_DENYWRITE:對文件的寫操作將被禁止,只能通過映射文件對原文件進行操作
MAP_LOCKED:將映射區鎖定,不會被虛擬內存重置
}
shared和private必須且只能選一個。
fd:代表文件的文件描述符。
offset:偏移量。一般設為0,表示從頭開始映射。
2、解除映射函數munmap()
//系統調用munmap() int munmap( void * addr, size_t len ) /*該調用在進程地址空間中解除一個映射關系,addr是調用mmap()時返回的地址,len是映射區的大小。當映射關系解除后,對原來映射地址的訪問將導致段錯誤發生。*/
1
2
3
4
5
6
實例代碼:
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。