多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開源 > C/C++ 使用mmap/munmap函數(shù)分配內(nèi)存

C/C++ 使用mmap/munmap函數(shù)分配內(nèi)存

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-10-06 08:00:01 閱讀次數(shù):2799次

在C/C++ 中常用的內(nèi)存分配和管理的方式有很多,如智能指針, STL容器, new/delete, malloc/free, brk, sbrk等等,最近研究了一下Unix比較底層的一種內(nèi)存管理方式mmap/munmap,需要完全自己來(lái)維護(hù)分配的虛擬內(nèi)存,沒有任何其他輔助的數(shù)據(jù)結(jié)構(gòu)來(lái)幫助維護(hù)內(nèi)存空間,但其優(yōu)點(diǎn)就是效率比其他的內(nèi)存分配方式要高。


一、在終端里輸入 man mmap 可以查看此函數(shù)的API文檔,此函數(shù)的具體描述如下:

void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 
具體參數(shù)含義
start :  指向欲映射的內(nèi)存起始地址,通常設(shè)為 NULL,代表讓系統(tǒng)自動(dòng)選定地址,映射成功后返回該地址。
length:  代表將文件中多大的部分映射到內(nèi)存。
prot  :  映射區(qū)域的保護(hù)方式。可以為以下幾種方式的組合:
                    PROT_EXEC 映射區(qū)域可被執(zhí)行
                    PROT_READ 映射區(qū)域可被讀取
                    PROT_WRITE 映射區(qū)域可被寫入
                    PROT_NONE 映射區(qū)域不能存取
flags :  影響映射區(qū)域的各種特性。在調(diào)用mmap()時(shí)必須要指定MAP_SHARED 或MAP_PRIVATE。
                    MAP_FIXED 如果參數(shù)start所指的地址無(wú)法成功建立映射時(shí),則放棄映射,不對(duì)地址做修正。通常不鼓勵(lì)用此旗標(biāo)。
                    MAP_SHARED 對(duì)映射區(qū)域的寫入數(shù)據(jù)會(huì)復(fù)制回文件內(nèi),而且允許其他映射該文件的進(jìn)程共享。
                    MAP_PRIVATE 對(duì)映射區(qū)域的寫入操作會(huì)產(chǎn)生一個(gè)映射文件的復(fù)制,即私人的“寫入時(shí)復(fù)制”(copy on write)對(duì)此區(qū)域作的任何修改都不會(huì)寫回原來(lái)的文件內(nèi)容。
                    MAP_ANONYMOUS建立匿名映射。此時(shí)會(huì)忽略參數(shù)fd,不涉及文件,而且映射區(qū)域無(wú)法和其他進(jìn)程共享。
                    MAP_DENYWRITE只允許對(duì)映射區(qū)域的寫入操作,其他對(duì)文件直接寫入的操作將會(huì)被拒絕。
                    MAP_LOCKED 將映射區(qū)域鎖定住,這表示該區(qū)域不會(huì)被置換(swap)。
fd    :  要映射到內(nèi)存中的文件描述符。如果使用匿名內(nèi)存映射時(shí),即flags中設(shè)置了MAP_ANONYMOUS,fd設(shè)為-1。有些系統(tǒng)不支持匿名內(nèi)存映射,則可以使用fopen打開/dev/zero文件,
          然后對(duì)該文件進(jìn)行映射,可以同樣達(dá)到匿名內(nèi)存映射的效果。
offset:文件映射的偏移量,通常設(shè)置為0,代表從文件最前方開始對(duì)應(yīng),offset必須是PAGE_SIZE的整數(shù)倍。

返回值:
      若映射成功則返回映射區(qū)的內(nèi)存起始地址,否則返回MAP_FAILED(-1),錯(cuò)誤原因存于errno 中。

錯(cuò)誤代碼:
            EBADF  參數(shù)fd 不是有效的文件描述詞
            EACCES 存取權(quán)限有誤。如果是MAP_PRIVATE 情況下文件必須可讀,使用MAP_SHARED則要有PROT_WRITE以及該文件要能寫入。
            EINVAL 參數(shù)start、length 或offset有一個(gè)不合法。
            EAGAIN 文件被鎖住,或是有太多內(nèi)存被鎖住。
            ENOMEM 內(nèi)存不足。
用戶層的調(diào)用很簡(jiǎn)單,其具體功能就是直接將物理內(nèi)存直接映射到用戶虛擬內(nèi)存,使用戶空間可以直接對(duì)物理空間操作。但是對(duì)于內(nèi)核層而言,其具體實(shí)現(xiàn)比較復(fù)雜。

二、例子程序如下

// // main.cpp // // // Created by ChengChao on 14-9-27. // Copyright (c) 2014年 cc. All rights reserved. // #include <iostream> #include <sys/mman.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main(int argc, const char * argv[]) { //申請(qǐng)內(nèi)存 int* arr = static_cast<int*>(mmap( NULL, //分配的首地址 getpagesize(), //分配內(nèi)存大小(必須是頁(yè)的整數(shù)倍, 32位1頁(yè)=4k) PROT_READ | PROT_WRITE, //映射區(qū)域保護(hù)權(quán)限:讀|寫 MAP_ANON | MAP_SHARED, //匿名映射(不涉及文件io), 后面兩個(gè)參數(shù)忽略 0, //要映射到內(nèi)存中的文件描述符 0 //文件映射的偏移量,通常設(shè)置為0,必須是頁(yè)的整數(shù)倍 )); printf("申請(qǐng)內(nèi)存大小=%dk ", sizeof(arr)); *arr = 10; *(arr + 1) = 20; *(arr + 2) = 30; printf("arr[2]=%d ", arr[2]); //釋放指針arr指向的內(nèi)存區(qū)域,并制定釋放的內(nèi)存大小 munmap(arr, getpagesize()); return 0; }

我是在64位的Mac OS X系統(tǒng)下編譯運(yùn)行的,64位系統(tǒng)內(nèi)存頁(yè)的大小為8k, 32位為4k

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------

上一篇 C++ Singleton

下一篇 二進(jìn)制加法

分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 精品在线免费观看 | jizzjizzjizz中国免费 | 羞羞视频免费网站入口 | 久久久久久久一精品 | 2021年最新久久久视精品爱 | 国产91一区二这在线播放 | 18videosex性欧美69 | 成人a级高清视频在线观看 成人a毛片高清视频 | 久久亚洲精品成人 | 亚洲图片另类小说 | 最新99国产成人精品视频免费 | 亚洲成人伊人网 | 欧美亚洲国产片在线观看 | 日韩亚州| 久久精品一区二区国产 | 日韩欧美国产亚洲 | 在线视频综合视频免费观看 | 成人国产欧美精品一区二区 | 欧美一区二区三区不卡免费观看 | 国产精品5 | 免费网站看v片在线观看 | 欧美激情_区二区三区 | 午夜国产精品久久影院 | 日本高清无吗免费播放 | 亚洲国产高清人在线 | 丰满奶水hdxxxx| 亚洲久久影院 | 一本毛片 | 东京干男人都知道 | 免费观看欧美成人1314w色 | 尤物视频在线观看网站 | 欧美性大战久久久久久 | 91久久大香伊蕉在人线 | 中文国产成人精品久久96 | 久久久久久综合一区中文字幕 | 精品国产91久久久久久久 | 九九欧美 | 久久久久久久综合日本亚洲 | 午夜手机福利 | 亚洲三级色 | 午夜影院色 |