日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内存映射mmap原理分析

發(fā)布時間:2025/3/21 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内存映射mmap原理分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來自:Joe James

鏈接:https://blog.csdn.net/joejames/article/details/37958017

一直都對內(nèi)存映射文件這個概念很模糊,不知道它和虛擬內(nèi)存有什么區(qū)別,而且映射這個詞也很讓人迷茫,今天終于搞清楚了。。。下面,我先解釋一下我對映射這個詞的理解,再區(qū)分一下幾個容易混淆的概念,之后,什么是內(nèi)存映射就很明朗了。

原理

首先,“映射”這個詞,就和數(shù)學(xué)課上說的“一一映射”是一個意思,就是建立一種一一對應(yīng)關(guān)系,在這里主要是只?硬盤上文件?的位置與進(jìn)程?邏輯地址空間?中一塊大小相同的區(qū)域之間的一一對應(yīng),如圖1中過程1所示。這種對應(yīng)關(guān)系純屬是邏輯上的概念,物理上是不存在的,原因是進(jìn)程的邏輯地址空間本身就是不存在的。在內(nèi)存映射的過程中,并沒有實際的數(shù)據(jù)拷貝,文件沒有被載入內(nèi)存,只是邏輯上被放入了內(nèi)存,具體到代碼,就是建立并初始化了相關(guān)的數(shù)據(jù)結(jié)構(gòu)(struct?address_space),這個過程有系統(tǒng)調(diào)用mmap()實現(xiàn),所以建立內(nèi)存映射的效率很高。

圖1.內(nèi)存映射原理??

?

既然建立內(nèi)存映射沒有進(jìn)行實際的數(shù)據(jù)拷貝,那么進(jìn)程又怎么能最終直接通過內(nèi)存操作訪問到硬盤上的文件呢?那就要看內(nèi)存映射之后的幾個相關(guān)的過程了。

mmap()會返回一個指針ptr,它指向進(jìn)程邏輯地址空間中的一個地址,這樣以后,進(jìn)程無需再調(diào)用read或write對文件進(jìn)行讀寫,而只需要通過ptr就能夠操作文件。但是ptr所指向的是一個邏輯地址,要操作其中的數(shù)據(jù),必須通過MMU將邏輯地址轉(zhuǎn)換成物理地址,如圖1中過程2所示。這個過程與內(nèi)存映射無關(guān)。?

前面講過,建立內(nèi)存映射并沒有實際拷貝數(shù)據(jù),這時,MMU在地址映射表中是無法找到與ptr相對應(yīng)的物理地址的,也就是MMU失敗,將產(chǎn)生一個缺頁中斷,缺頁中斷的中斷響應(yīng)函數(shù)會在swap中尋找相對應(yīng)的頁面,如果找不到(也就是該文件從來沒有被讀入內(nèi)存的情況),則會通過mmap()建立的映射關(guān)系,從硬盤上將文件讀取到物理內(nèi)存中,如圖1中過程3所示。這個過程與內(nèi)存映射無關(guān)。

如果在拷貝數(shù)據(jù)時,發(fā)現(xiàn)物理內(nèi)存不夠用,則會通過虛擬內(nèi)存機(jī)制(swap)將暫時不用的物理頁面交換到硬盤上,如圖1中過程4所示。這個過程也與內(nèi)存映射無關(guān)。

效率

從代碼層面上看,從硬盤上將文件讀入內(nèi)存,都要經(jīng)過文件系統(tǒng)進(jìn)行數(shù)據(jù)拷貝,并且數(shù)據(jù)拷貝操作是由文件系統(tǒng)和硬件驅(qū)動實現(xiàn)的,理論上來說,拷貝數(shù)據(jù)的效率是一樣的。但是通過內(nèi)存映射的方法訪問硬盤上的文件,效率要比read和write系統(tǒng)調(diào)用高,這是為什么呢?原因是read()是系統(tǒng)調(diào)用,其中進(jìn)行了數(shù)據(jù)拷貝,它首先將文件內(nèi)容從硬盤拷貝到內(nèi)核空間的一個緩沖區(qū),如圖2中過程1,然后再將這些數(shù)據(jù)拷貝到用戶空間,如圖2中過程2,在這個過程中,實際上完成了?兩次數(shù)據(jù)拷貝?;而mmap()也是系統(tǒng)調(diào)用,如前所述,mmap()中沒有進(jìn)行數(shù)據(jù)拷貝,真正的數(shù)據(jù)拷貝是在缺頁中斷處理時進(jìn)行的,由于mmap()將文件直接映射到用戶空間,所以中斷處理函數(shù)根據(jù)這個映射關(guān)系,直接將文件從硬盤拷貝到用戶空間,只進(jìn)行了?一次數(shù)據(jù)拷貝?。因此,內(nèi)存映射的效率要比read/write效率高。

圖2.read系統(tǒng)調(diào)用原理

?

下面這個程序,通過read和mmap兩種方法分別對硬盤上一個名為“mmap_test”的文件進(jìn)行操作,文件中存有10000個整數(shù),程序兩次使用不同的方法將它們讀出,加1,再寫回硬盤。通過對比可以看出,read消耗的時間將近是mmap的兩到三倍。

#include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> #include<sys/time.h> #include<fcntl.h> #include<sys/mman.h>#define?MAX?10000int?main() { int?i=0; int?count=0,?fd=0; struct?timeval?tv1,?tv2; int?*array?=?(int?*)malloc(?sizeof(int)*MAX?);/*read*/gettimeofday(?&tv1,?NULL?); fd?=?open(?"mmap_test",?O_RDWR?); if(?sizeof(int)*MAX?!=?read(?fd,?(void?*)array,?sizeof(int)*MAX?)?) { printf(?"Reading?data?failed.../n"?); return?-1; } for(?i=0;?i<MAX;?++i?)++array[?i?]; if(?sizeof(int)*MAX?!=?write(?fd,?(void?*)array,?sizeof(int)*MAX?)?) { printf(?"Writing?data?failed.../n"?); return?-1; } free(?array?); close(?fd?); gettimeofday(?&tv2,?NULL?); printf(?"Time?of?read/write:?%dms/n",?tv2.tv_usec-tv1.tv_usec?);/*mmap*/gettimeofday(?&tv1,?NULL?); fd?=?open(?"mmap_test",?O_RDWR?); array?=?mmap(?NULL,?sizeof(int)*MAX,?PROT_READ|PROT_WRITE,?MAP_SHARED,?fd,?0?); for(?i=0;?i<MAX;?++i?)++array[?i?]; munmap(?array,?sizeof(int)*MAX?); msync(?array,?sizeof(int)*MAX,?MS_SYNC?); free(?array?); close(?fd?); gettimeofday(?&tv2,?NULL?); printf(?"Time?of?mmap:?%dms/n",?tv2.tv_usec-tv1.tv_usec?);return?0; }

輸出結(jié)果:

Time?of?read/write:?154ms Time?of?mmap:?68ms

總結(jié)

以上是生活随笔為你收集整理的Linux内存映射mmap原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美在线一区二区 | 日韩伊人 | 亚洲操片| 光棍福利视频 | 97精品人人a片免费看 | 亚洲美女一区 | 亚洲涩涩网站 | 香蕉视频成人在线观看 | 在线中文字幕第一页 | 国产网站在线免费观看 | 日本精品影院 | 欧美激情视频网站 | 好看的av网址 | 男人手机天堂 | 黑料福利 | 亚洲精品美女在线观看 | 日日碰狠狠添天天爽 | 亚洲欧美久久久 | 青娱乐伊人 | 亚洲精品18在线观看 | 久久你懂的 | 青青久在线 | www.狠狠| jizzjizz美国| 国产在线视频不卡 | 欧美日韩精品网站 | 日韩中文在线一区 | 中文字幕97 | 高清毛片aaaaaaaaa郊外 | 吞精囗交69激情欧美 | 荔枝视频污 | 91pron在线 | 蜜桃av免费在线观看 | 一区二区三区在线播放 | 激情成人av | 国产日韩欧美日韩大片 | 97caocao| 99精品一区二区三区无码吞精 | 成人香蕉视频 | 免费一级欧美 | 欧美另类一区 | 外国a级片| 制服丝袜亚洲色图 | 精品国产一区二区三区四区 | 韩国在线不卡 | 午夜av影视 | 国产精品一区二区三区免费观看 | 色图自拍偷拍 | 黑人与日本少妇高潮 | 操网站 | 日本欧美久久久久免费播放网 | 天天操天天干天天干 | 国产一级大片在线观看 | 最新国产在线视频 | 自拍偷拍第八页 | 日韩欧美在线观看一区二区三区 | 日韩bbw| 激情五月综合 | 国产青草视频在线观看 | 亚洲色图15p | 日韩1区| 日韩av在线播放不卡 | 久九九| 亚洲一区高清 | 国产成人一区二区三区别 | 久草一区二区 | 久久精品亚洲无码 | 熟妇高潮一区二区三区在线播放 | 中文字幕欧美日韩 | 亚洲AV永久无码国产精品国产 | 18禁超污无遮挡无码免费游戏 | 三级4级全黄60分钟 成人自拍视频 | 国产成人一区二区三区视频 | 蜜臀久久99精品久久久久宅男 | 一区二区三区在线观看免费视频 | 国产又爽又黄免费软件 | 性农村xxxxx小树林 | www色com | 四虎一国产精品一区二区影院 | 欧美一及片| 首尔之春在线观看 | 日韩城人网站 | 午夜影院视频 | www.17c.com喷水少妇 | 免费观看a级片 | www.欧美成人 | 日韩专区av | 成年人网站黄色 | 深夜毛片 | 黄色a一级视频 | 影音先锋在线观看视频 | 在线看av的网址 | 少妇裸体挤奶汁奶水视频 | 国产污网站 | 日韩理论在线观看 | 国产成人免费看一级大黄 | 中文理论片 | 欧美激情综合色综合啪啪五月 | 粗大的内捧猛烈进出在线视频 |