青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

File Mapping析疑

轉(zhuǎn)載自:http://blog.sina.com.cn/s/blog_5e83fce60100pz2p.html

最初接觸File Mapping是為了能夠方便地處理一個(gè)幾百兆的大文件,當(dāng)時(shí)查了些資料大概了解了一下就匆匆動(dòng)手了,因?yàn)橹淙欢恢渌匀唬谑褂眠^程中遇到了不少問題,今天在這里就是想把這些歷史遺留問題解決掉。

    問題一、Mapping有“映射”之意,那么在該語境中形成映射關(guān)系的雙方是誰,也就是從哪里映射到哪里呢?
    要回答這個(gè)問題,我們必須要對(duì)虛擬內(nèi)存有所了解。現(xiàn)在操作系統(tǒng)中,大多都使用虛擬內(nèi)存技術(shù)來對(duì)內(nèi)存進(jìn)行管理。通過虛擬內(nèi)存,操作系統(tǒng)給予了每個(gè)進(jìn)程一個(gè)統(tǒng)一的地址空間。在32位操作系統(tǒng)中,該地址空間的大小達(dá)到 2^32個(gè),也就是4G了。從一個(gè)進(jìn)程的角度看來,這4G的地址空間是自己獨(dú)享的,也就是說,如果操作系統(tǒng)允許的話,我可以訪問這4G地址空間中的任何一個(gè)。當(dāng)然,操作系統(tǒng)是不可能讓一個(gè)進(jìn)程隨心所欲地使用這些地址的。下面,我們來看看這些地址具體是怎樣分配的:



上面這個(gè)圖大家應(yīng)該都很熟悉,它是Linux中進(jìn)程的內(nèi)存映象。我們可以看到,在4G的地址空間中,我們先從下往上看, 0~0x08047ffff(大概128M左右)是系統(tǒng)保留的,不能使用。read-only segment和read/write segment用以存放系統(tǒng)加載器從可執(zhí)行文件中載入的代碼段以及數(shù)據(jù)段等內(nèi)容。運(yùn)行時(shí)堆大家應(yīng)該都比較清楚,是動(dòng)態(tài)分配內(nèi)存的地方,我們通過malloc和free等函數(shù)動(dòng)態(tài)在堆中分配和釋放內(nèi)存,堆的大小是往上增長的,最大可達(dá)到0x3FFFFFFF處。好,到這里我們?cè)趶纳贤驴矗?xc0000000以上是核心虛擬內(nèi)存,專門為操作系統(tǒng)核心的數(shù)據(jù)結(jié)構(gòu)以及代碼預(yù)留的,一般用戶進(jìn)程無權(quán)使用。然后就到了棧區(qū)了,這里是系統(tǒng)保存跟函數(shù)操作有關(guān)的數(shù)據(jù),如局部變量,函數(shù)參數(shù)等內(nèi)容。與堆不一樣,棧是從上往下增長的,其棧頂通過寄存器esp指出。那么被堆和棧夾著的區(qū)域是干什么的呢?原來,那是用來放動(dòng)態(tài)共享庫的。在C/C++庫文件簡介中我們談到了共享庫,動(dòng)態(tài)共享庫是在程序被載入時(shí)或者運(yùn)行過程中載入到進(jìn)程內(nèi)存空間中的,它存放的地方就是我們稱作內(nèi)存映射區(qū)的這個(gè)地方。
    這樣一看,原來進(jìn)程開始運(yùn)行時(shí),4G的地址已經(jīng)被用掉了不少,其中,光是操作系統(tǒng)所占用的核心虛擬內(nèi)存就達(dá)到1G,加上程序的代碼和數(shù)據(jù)以及動(dòng)態(tài)共享庫等等,我們大概就剩下2G左右的地址空間可以使用了。那么,這2G空間我們是如何使用的呢?第一,我們使用malloc函數(shù),在堆中分配空間,使堆往上增長;第二,我們?cè)诤瘮?shù)中使用局部的數(shù)據(jù),以及函數(shù)調(diào)用時(shí)現(xiàn)場(chǎng)的保留,使棧空間往下增長;第三,我們使用File Mapping,使內(nèi)存映射區(qū)往上增長。
    好了,終于出現(xiàn)File Mapping 了。現(xiàn)在,我們也可以知道題目中“映射”的其中一方了:內(nèi)存。原來它就是在內(nèi)存映射區(qū)中的一段地址空間。那么,“映射”的另一方又是什么呢?那自然是文件了。我們可以將任何類型任何大小(只要操作系統(tǒng)支持,現(xiàn)在win32支持最大的文件為16EB,就是2^64)的文件映射到內(nèi)存映射區(qū)中。當(dāng)然,太大的文件我們不可能一次性把它全部映射到虛擬內(nèi)存中去,畢竟我們大概只有2G的地址空間,兩者間是不可能構(gòu)成一一對(duì)應(yīng)的關(guān)系的。此時(shí),我們可以將文件分段進(jìn)行映射,每次將文件的一部分映射到內(nèi)存空間中。映射完以后,我們就可以像訪問內(nèi)存那樣直接訪問文件了。

    問題二、數(shù)據(jù)在哪呢?數(shù)據(jù)文件?物理內(nèi)存?頁面文件?
    這里,我們暫且將被映射的文件稱為數(shù)據(jù)文件。當(dāng)我們映射好一個(gè)數(shù)據(jù)文件以后,操作系統(tǒng)并不會(huì)馬上將文件中的內(nèi)容提交到物理內(nèi)存中去,數(shù)據(jù)還是原封不動(dòng)地放在數(shù)據(jù)文件中。但是,當(dāng)程序首次對(duì)文件中某個(gè)數(shù)據(jù)進(jìn)行訪問時(shí)(read /write),操作系統(tǒng)就會(huì)將該數(shù)據(jù)從數(shù)據(jù)文件中調(diào)入物理內(nèi)存中,供CPU使用。操作完畢后,當(dāng)我們解除映射時(shí),操作系統(tǒng)將根據(jù)映射的屬性(write/write-on-copy)決定是將更改后的數(shù)據(jù)寫回到數(shù)據(jù)文件中還是將更改直接丟棄。Readonly 不存在這個(gè)問題,因?yàn)椴豢赡鼙桓模虼藆nmap時(shí)只需將內(nèi)存中的數(shù)據(jù)丟棄就可以了。
     這中間還有一個(gè)問題,那就是在映射以后和解除映射之前這個(gè)時(shí)間段內(nèi),物理內(nèi)存中的數(shù)據(jù)是有可能被換出的(swap out),那么,換出時(shí)這些數(shù)據(jù)是被存放在數(shù)據(jù)文件中還是像一般數(shù)據(jù)那樣存放在系統(tǒng)的頁面文件中呢?同樣,這也是跟映射的屬性緊密相關(guān)的:
    如果映射為readonly,那么換出時(shí)只需修改相應(yīng)的頁表(page table)內(nèi)容,標(biāo)注其已被換出即可。
    如果映射為write-on-copy,那么換出將存放在頁面文件中,
    如果映射為write,那么換出時(shí)將寫會(huì)到數(shù)據(jù)文件中。
      
    問題三、使用File Mapping為什么可以提高訪問文件的速度呢?
     這是因?yàn)椴僮飨到y(tǒng)在處理一般讀寫跟處理內(nèi)存映射使用的方法不一樣。在處理一般的讀寫操作時(shí),操作系統(tǒng)一般使用中斷的方式,先將內(nèi)容拷貝到核心虛擬內(nèi)存緩沖,然后再拷貝到進(jìn)程空間中;但是,處理內(nèi)存映射文件時(shí),一般使用虛擬內(nèi)存管理器,無需進(jìn)行中間的拷貝過程,因此速度加快。此外,像Windows這樣使用頁式管理虛擬內(nèi)存的操作系統(tǒng)中,數(shù)據(jù)的換入換出都是以頁為單位的(通常是4k或者8k),因?yàn)槌绦蛞话愣季哂袝r(shí)間和空間的局部性(locality),因此,相當(dāng)于進(jìn)行了大量的緩沖操作,有利于提高性能。

    問題四、什么情況適合使用 File Mapping呢?看看人家的建議:
File mapping is effective in the following situations:

  • You have a large file whose contents you want to access randomly one or more times.

  • You have a small file whose contents you want to read into memory all at once and access frequently. This technique is best for files that are no more than a few virtual memory pages in size.

  • You want to cache specific portions of a file in memory. File mapping eliminates the need to cache the data at all, which leaves more room in the system disk caches for other data.

You should not use file mapping in the following situations:

  • You want to read a file sequentially from start to finish only once.

  • The file is several hundred megabytes or more in size. (Mapping large files fills virtual memory space quickly. In addition, your program may not have the available space if it has been running for a while or its memory space is fragmented.)


    問題五、為什么在操作大文件時(shí)速度變得很慢呢?
    遇到這個(gè)問題,你可以首先打開Windows的任務(wù)管理器,看看你進(jìn)程究竟使用了多少的內(nèi)存。呵呵,通常都是個(gè)天文數(shù)字。占用了那么多的內(nèi)存,系統(tǒng)肯定就很慢了。遇到這樣的問題,我們通常都是使用內(nèi)存映射文件對(duì)數(shù)據(jù)文件進(jìn)行遍歷操作,譬如像將A文件拷貝為B文件。上面我們提到,操作系統(tǒng)是在真正用到數(shù)據(jù)的時(shí)候才會(huì)把它從數(shù)據(jù)文件中提交到物理內(nèi)存里面的,因此,剛做好映射不進(jìn)行操作的話,進(jìn)程并不會(huì)消耗多少內(nèi)存。但是,一旦你開始進(jìn)行遍歷,那么,操作系統(tǒng)就馬上將它們調(diào)入物理內(nèi)存中(你可以看看頁面錯(cuò)誤的數(shù)量,肯定是飛速增長的),于是,內(nèi)存就一路飛漲了。
    怎么辦呢?不要一次性把整個(gè)文件進(jìn)行映射,而是分開進(jìn)行,操作完一部分后,將它unmap掉,這樣,操作系統(tǒng)就會(huì)把它們“趕回家去”了,內(nèi)存就不會(huì)占用太高了。

posted on 2014-02-25 00:35 楊粼波 閱讀(667) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产夜色精品一区二区av| 免费av成人在线| 国产精品久久久久永久免费观看| 夜夜嗨av一区二区三区免费区| 亚洲国内在线| 免费影视亚洲| 一区二区免费在线观看| 一本色道久久综合| 国产日韩高清一区二区三区在线| 久久久欧美精品| 美女黄色成人网| 在线一区二区三区四区五区| 亚洲自拍偷拍福利| 激情欧美日韩| 欧美激情在线有限公司| 欧美日韩国产精品成人| 性欧美8khd高清极品| 性伦欧美刺激片在线观看| 亚洲第一免费播放区| 91久久精品视频| 国产美女扒开尿口久久久| 欧美成人免费在线观看| 国产精品99久久久久久有的能看| 亚洲国产精品成人综合| 亚洲精品欧美日韩| 国产亚洲在线观看| 亚洲精品乱码久久久久| 久久久蜜桃精品| 亚洲影音先锋| 亚洲电影专区| 亚洲欧美日韩国产中文| 亚洲精品一区在线观看香蕉| 亚洲欧美日韩精品在线| 亚洲人成在线影院| 性伦欧美刺激片在线观看| av成人激情| 久热精品视频在线观看一区| 午夜视频在线观看一区二区三区| 免费欧美高清视频| 久久久久欧美精品| 欧美午夜不卡在线观看免费| 欧美高清在线视频观看不卡| 国产精品视频免费在线观看| 亚洲欧洲日产国产网站| 在线观看亚洲精品视频| 亚洲欧美清纯在线制服| 一区二区日韩伦理片| 每日更新成人在线视频| 久久久蜜桃一区二区人| 国产日韩欧美一区二区三区在线观看 | 久久激情婷婷| 欧美网站在线| 亚洲人成亚洲人成在线观看图片| 在线观看日韩av电影| 久久精品国产亚洲一区二区三区| 亚洲一区二区3| 欧美日韩一区二区在线视频 | 亚洲欧美精品| 欧美日韩一区二区三区| 亚洲国产一区二区三区高清| 一区视频在线| 久久精品亚洲一区二区三区浴池| 欧美一区二区三区在线免费观看| 欧美三级在线视频| 一本色道久久| 亚洲一区日韩在线| 欧美日韩另类在线| 亚洲精品视频在线| 中文精品一区二区三区 | 午夜精品偷拍| 久久成人免费| 国语自产精品视频在线看一大j8| 欧美一区二区三区的| 久久久五月天| 影音先锋亚洲一区| 牛牛影视久久网| 亚洲精品乱码久久久久久久久| 亚洲激情网站| 欧美韩日一区二区三区| 亚洲精品一区二区三区99| 这里只有精品在线播放| 欧美视频在线观看免费| 午夜精品久久久久久久99水蜜桃| 欧美专区一区二区三区| 伊人春色精品| 欧美片在线播放| 亚洲一区二区三区精品视频| 久久精品中文字幕一区| 91久久极品少妇xxxxⅹ软件| 欧美日韩国产小视频| 久久精品二区三区| 亚洲欧美久久| 久久久最新网址| 裸体素人女欧美日韩| 在线不卡a资源高清| 欧美精品99| 亚洲欧美视频| 欧美日韩一二三区| 性久久久久久久| 亚洲国产综合视频在线观看| 亚洲性感美女99在线| 国内久久精品| 欧美ab在线视频| 亚洲一区成人| 欧美国产日韩一区二区在线观看| 99伊人成综合| 国内精品美女在线观看| 欧美精品一区二区三区蜜桃 | 久久九九久久九九| 亚洲三级网站| 国产一区二区三区四区| 欧美精品二区三区四区免费看视频| 亚洲一区二区在线播放| 亚洲第一色在线| 欧美一区二粉嫩精品国产一线天| 亚洲欧洲精品一区二区三区不卡| 国产农村妇女精品| 欧美区一区二区三区| 欧美一区二区视频观看视频| 亚洲欧洲在线视频| 久久一区中文字幕| 性色av一区二区三区红粉影视| 亚洲精品社区| 伊人成人网在线看| 一本色道久久| 亚洲黄色三级| 久久一区亚洲| 久久天天躁狠狠躁夜夜av| 亚洲一区二区在| 一区二区三区国产在线| 亚洲精品日本| 亚洲国产精品一区二区久| 韩国av一区二区三区在线观看| 国产精品超碰97尤物18| 欧美激情亚洲一区| 欧美福利一区二区| 蜜臀av一级做a爰片久久| 久久精品视频在线播放| 欧美一区二视频| 欧美伊人精品成人久久综合97| 亚洲经典在线看| 伊人久久综合97精品| 激情文学综合丁香| 韩日视频一区| 国产一区再线| 在线播放亚洲| 亚洲国产99精品国自产| 91久久国产综合久久蜜月精品 | 亚洲精华国产欧美| 亚洲啪啪91| 亚洲精品久久久一区二区三区| 亚洲经典在线| 亚洲美女视频在线观看| 日韩一级在线观看| 亚洲先锋成人| 欧美有码视频| 美女91精品| 91久久夜色精品国产九色| 亚洲精品国产精品久久清纯直播 | 久久精品国产96久久久香蕉| 欧美午夜精品伦理| 欧美亚洲视频一区二区| 欧美成人精品在线视频| 亚洲精品国产品国语在线app | 欧美中文字幕视频| 欧美色中文字幕| 91久久精品日日躁夜夜躁国产| 久久精品国产精品亚洲综合| 亚洲性图久久| 欧美性色视频在线| 一区二区三区高清视频在线观看| 欧美国产先锋| 欧美另类综合| 亚洲精品一区二区在线观看| 欧美黄色成人网| 老司机午夜精品| 一本色道精品久久一区二区三区| 亚洲精品国产欧美| 国产老女人精品毛片久久| 久久久噜噜噜久噜久久| 美国三级日本三级久久99| 亚洲日本aⅴ片在线观看香蕉| 麻豆精品一区二区av白丝在线| 欧美在线视频二区| 国产色婷婷国产综合在线理论片a| 久久久久久亚洲精品杨幂换脸| 老**午夜毛片一区二区三区| 一区二区三区**美女毛片| 亚洲综合欧美日韩| 亚洲第一在线| 99热在线精品观看| 国模一区二区三区| 亚洲人成网站在线观看播放| 国产精品日日做人人爱 | 免费日韩av| 欧美视频一区二区在线观看| 久久久久.com| 欧美日韩高清不卡| 久久精品免视看| 美女免费视频一区|