文件空間映射mmap()函數(是什么,為什么,怎么用)

      網友投稿 1446 2022-05-29

      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 void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset); //以下這點還是要再提一下的,開辟空間的時候要掂量掂量 /* 文件無法完成拓展,因為mmap到內存的時候,你所能夠操作的范圍就確定了,無法增加文件的長度。 */

      文件空間映射mmap()函數(是什么,為什么,怎么用)

      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 ; #include ; #include ; #include ; typedef struct { char name[4]; int age; }people; main(int argc, char** argv) // map a normal file as shared mem: { int fd,i; people *p_map; char temp; fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,0777); lseek(fd,sizeof(people)*5-1,SEEK_SET); write(fd,"",1); p_map = (people*) mmap( NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 ); close( fd ); temp = 'a'; //直接使用這種寫入方式 for(i=0; i<10; i++) { temp += 1; memcpy( ( *(p_map+i) ).name, &temp,2 ); ( *(p_map+i) ).age = 20+i; } printf(" initialize over /n "); sleep(10); munmap( p_map, sizeof(people)*10 ); printf( "umap ok /n" ); }

      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小時內刪除侵權內容。

      上一篇:Elasticsearch Query DSL之Compound queries(復合查詢)
      下一篇:Linxux應用開發-串口下載命令rzsz交叉編譯
      相關文章
      亚洲大尺码专区影院| 亚洲欧美成人av在线观看| 亚洲免费综合色在线视频| 亚洲中文字幕精品久久| 亚洲一区在线视频观看| 91大神亚洲影视在线| 亚洲s色大片在线观看| 亚洲国产成人片在线观看| 亚洲码国产精品高潮在线| 亚洲中文字幕无码爆乳AV| 亚洲人成无码网WWW| 日本亚洲高清乱码中文在线观看| 最新亚洲春色Av无码专区| 亚洲人成网站免费播放| 亚洲综合色区在线观看| 亚洲精品天堂成人片AV在线播放 | 亚洲综合色一区二区三区| 2020年亚洲天天爽天天噜| 亚洲精品综合在线影院| 亚洲欧美熟妇综合久久久久| 亚洲中文字幕久久精品无码A| 亚洲色成人WWW永久在线观看| 亚洲av永久无码| 亚洲欧洲中文日韩av乱码| 国产亚洲精品久久久久秋霞| 狠狠色伊人亚洲综合成人| 亚洲成人午夜在线| 亚洲一区无码中文字幕乱码| 亚洲а∨天堂久久精品9966| 亚洲一区二区三区播放在线| 亚洲欧美一区二区三区日产| WWW亚洲色大成网络.COM | 日韩精品亚洲人成在线观看 | 亚洲永久永久永久永久永久精品| 亚洲成AV人片在线观看无码 | 亚洲av无码成人精品区一本二本 | 亚洲永久网址在线观看| 日韩精品亚洲专区在线影视| 国产精品亚洲mnbav网站 | 亚洲AV无码精品无码麻豆| 亚洲女同成人AⅤ人片在线观看|