怎樣解析Mmap原理和使用方式

這篇文章將為大家詳細講解有關(guān)怎樣解析Mmap原理和使用方式,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

十年的天臺網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整天臺建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“天臺網(wǎng)站設(shè)計”,“天臺網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

一、傳統(tǒng)的讀寫文件

一般來說,修改一個文件的內(nèi)容需要如下3個步驟:

  • 把文件內(nèi)容讀入到內(nèi)存中。

  • 修改內(nèi)存中的內(nèi)容。

  • 把內(nèi)存的數(shù)據(jù)寫入到文件中。

過程如圖 1 所示:

怎樣解析Mmap原理和使用方式

如果使用代碼來實現(xiàn)上面的過程,代碼如下:

read(fd, buf, 1024);  // 讀取文件的內(nèi)容到buf ...                   // 修改buf的內(nèi)容 write(fd, buf, 1024); // 把buf的內(nèi)容寫入到文件

從圖 1 中可以看出,頁緩存(page cache) 是讀寫文件時的中間層,內(nèi)核使用 頁緩存 與文件的數(shù)據(jù)塊關(guān)聯(lián)起來。所以應(yīng)用程序讀寫文件時,實際操作的是  頁緩存。

二、使用 mmap 讀寫文件

從傳統(tǒng)讀寫文件的過程中,我們可以發(fā)現(xiàn)有個地方可以優(yōu)化:如果可以直接在用戶空間讀寫 頁緩存,那么就可以免去將 頁緩存  的數(shù)據(jù)復(fù)制到用戶空間緩沖區(qū)的過程。

那么,有沒有這樣的技術(shù)能實現(xiàn)上面所說的方式呢?答案是肯定的,就是 mmap。

使用 mmap 系統(tǒng)調(diào)用可以將用戶空間的虛擬內(nèi)存地址與文件進行映射(綁定),對映射后的虛擬內(nèi)存地址進行讀寫操作就如同對文件進行讀寫操作一樣。原理如圖 2  所示:

怎樣解析Mmap原理和使用方式

前面我們介紹過,讀寫文件都需要經(jīng)過 頁緩存,所以 mmap 映射的正是文件的 頁緩存,而非磁盤中的文件本身。由于 mmap 映射的是文件的  頁緩存,所以就涉及到同步的問題,即 頁緩存 會在什么時候把數(shù)據(jù)同步到磁盤。

Linux 內(nèi)核并不會主動把 mmap 映射的 頁緩存 同步到磁盤,而是需要用戶主動觸發(fā)。同步 mmap 映射的內(nèi)存到磁盤有 4 個時機:

  • 調(diào)用 msync 函數(shù)主動進行數(shù)據(jù)同步(主動)。

  • 調(diào)用 munmap 函數(shù)對文件進行解除映射關(guān)系時(主動)。

  • 進程退出時(被動)。

  • 系統(tǒng)關(guān)機時(被動)。

三、mmap的使用方式

下面我們介紹一下怎么使用 mmap,mmap 函數(shù)的原型如下:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

下面介紹一下 mmap 函數(shù)的各個參數(shù)作用:

  • addr:指定映射的虛擬內(nèi)存地址,可以設(shè)置為 NULL,讓 Linux 內(nèi)核自動選擇合適的虛擬內(nèi)存地址。

  • length:映射的長度。

  • prot:映射內(nèi)存的保護模式,可選值如下:

    • PROT_EXEC:可以被執(zhí)行。

    • PROT_READ:可以被讀取。

    • PROT_WRITE:可以被寫入。

    • PROT_NONE:不可訪問。

  • flags:指定映射的類型,常用的可選值如下:

    • MAP_FIXED:使用指定的起始虛擬內(nèi)存地址進行映射。

    • MAP_SHARED:與其它所有映射到這個文件的進程共享映射空間(可實現(xiàn)共享內(nèi)存)。

    • MAP_PRIVATE:建立一個寫時復(fù)制(Copy on Write)的私有映射空間。

    • MAP_LOCKED:鎖定映射區(qū)的頁面,從而防止頁面被交換出內(nèi)存。

    • ...

  • fd:進行映射的文件句柄。

  • offset:文件偏移量(從文件的何處開始映射)。

介紹完 mmap 函數(shù)的原型后,我們現(xiàn)在通過一個簡單的例子介紹怎么使用 mmap:

int fd = open(filepath, O_RDWR, 0644);                           // 打開文件 void *addr = mmap(NULL, 8192, PROT_WRITE, MAP_SHARED, fd, 4096); // 對文件進行映射

在上面例子中,我們先通過 open 函數(shù)以可讀寫的方式打開文件,然后通過 mmap 函數(shù)對文件進行映射,映射的方式如下:

  • addr 參數(shù)設(shè)置為 NULL,表示讓操作系統(tǒng)自動選擇合適的虛擬內(nèi)存地址進行映射。

  • length 參數(shù)設(shè)置為 8192 表示映射的區(qū)域為 2 個內(nèi)存頁的大小(一個內(nèi)存頁的大小為 4 KB)。

  • prot 參數(shù)設(shè)置為 PROT_WRITE 表示映射的內(nèi)存區(qū)為可讀寫。

  • flags 參數(shù)設(shè)置為 MAP_SHARED 表示共享映射區(qū)。

  • fd 參數(shù)設(shè)置打開的文件句柄。

  • offset 參數(shù)設(shè)置為 4096 表示從文件的 4096 處開始映射。

mmap 函數(shù)會返回映射后的內(nèi)存地址,我們可以通過此內(nèi)存地址對文件進行讀寫操作。我們通過圖 3 展示上面例子在內(nèi)核中的結(jié)構(gòu):

怎樣解析Mmap原理和使用方式

關(guān)于怎樣解析Mmap原理和使用方式就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

當(dāng)前文章:怎樣解析Mmap原理和使用方式
標(biāo)題來源:http://bm7419.com/article12/pssogc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站內(nèi)鏈靜態(tài)網(wǎng)站、品牌網(wǎng)站制作移動網(wǎng)站建設(shè)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)