第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我什么時候應(yīng)該使用mmap進(jìn)行文件訪問?

我什么時候應(yīng)該使用mmap進(jìn)行文件訪問?

C
喵喵時光機(jī) 2019-07-23 15:53:54
我什么時候應(yīng)該使用mmap進(jìn)行文件訪問?POSIX環(huán)境提供至少兩種訪問文件的方法。有標(biāo)準(zhǔn)的系統(tǒng)調(diào)用open(),read(),write(),和朋友,但也有使用的選項(xiàng)mmap(),將文件映射到虛擬內(nèi)存。何時優(yōu)先使用一個而不是另一個?它們各自的優(yōu)勢是什么,包括兩個接口?
查看完整描述

3 回答

?
阿晨1998

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個贊

如果你有多個進(jìn)程從同一個文件以只讀方式訪問數(shù)據(jù),那么mmap很棒,這在我編寫的服務(wù)器系統(tǒng)類型中很常見。mmap允許所有這些進(jìn)程共享相同的物理內(nèi)存頁面,從而節(jié)省大量內(nèi)存。

mmap還允許操作系統(tǒng)優(yōu)化分頁操作。例如,考慮兩個程序; 程序A將1MB文件讀入使用malloc創(chuàng)建的緩沖區(qū),程序B將1MB文件格式化為內(nèi)存。如果操作系統(tǒng)必須將A的一部分內(nèi)存交換掉,它必須將緩沖區(qū)的內(nèi)容寫入交換,然后才能重用內(nèi)存。在B的情況下,任何未修改的mmap頁面都可以立即重用,因?yàn)椴僮飨到y(tǒng)知道如何從他們mmap的現(xiàn)有文件中恢復(fù)它們。(操作系統(tǒng)可以通過最初將可寫mmap的頁面標(biāo)記為只讀并捕獲seg錯誤來檢測哪些頁面未修改,類似于寫入時復(fù)制策略)。

mmap對于進(jìn)程間通信也很有用。您可以在需要通信的進(jìn)程中將文件映射為讀/寫,然后在mmap'd區(qū)域中使用同步原語(這是MAP_HASSEMAPHORE標(biāo)志的用途)。

如果您需要在32位計(jì)算機(jī)上使用非常大的文件,那么mmap的一個地方可能很尷尬。這是因?yàn)閙map必須在進(jìn)程的地址空間中找到一個連續(xù)的地址塊,該地址空間足夠大,以適應(yīng)所映射文件的整個范圍。如果您的地址空間變得碎片化,這可能會成為一個問題,您可能有2 GB的地址空間可用,但沒有單獨(dú)的范圍可以適合1 GB的文件映射。在這種情況下,您可能必須將文件映射到比您想要的更小的塊中。

mmap作為讀/寫替代品的另一個潛在尷尬是你必須在頁面大小的偏移量上開始映射。如果您只想在偏移X處獲取一些數(shù)據(jù),則需要修復(fù)該偏移量,以便與mmap兼容。

最后,讀/寫只是你的方式可以與某些類型的文件的工作。mmap不能用于管道和ttys之類的東西。


查看完整回答
反對 回復(fù) 2019-07-23
?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個贊

我發(fā)現(xiàn)mmap()不具有優(yōu)勢的一個領(lǐng)域是讀取小文件(16K以下)。與僅執(zhí)行單個read()系統(tǒng)調(diào)用相比,讀取整個文件的頁面錯誤開銷非常高。這是因?yàn)閮?nèi)核有時可以在您的時間片中完全滿足讀取,這意味著您的代碼不會被切換掉。由于頁面錯誤,似乎更有可能安排另一個程序,使文件操作具有更高的延遲。


查看完整回答
反對 回復(fù) 2019-07-23
?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個贊

mmap當(dāng)您對大文件進(jìn)行隨機(jī)訪問時具有優(yōu)勢。另一個優(yōu)點(diǎn)是您可以通過內(nèi)存操作(memcpy,指針?biāo)阈g(shù))訪問它,而無需擔(dān)心緩沖。當(dāng)結(jié)構(gòu)大于緩沖區(qū)時,使用緩沖區(qū)時,正常I / O有時會非常困難。處理它的代碼通常很難正確,mmap通常更容易。這就是說,工作時有一些陷阱mmap。正如人們已經(jīng)提到的那樣,mmap設(shè)置成本非常高,因此僅適用于給定尺寸(從機(jī)器到機(jī)器)不同。

對于對文件的純順序訪問,它也不總是更好的解決方案,盡管適當(dāng)?shù)恼{(diào)用madvise可以緩解問題。

您必須小心架構(gòu)的對齊限制(SPARC,itanium),使用讀/寫IO緩沖區(qū)通常是正確對齊的,并且在取消引用轉(zhuǎn)換指針時不會陷阱。

您還必須小心,不要在地圖外訪問。如果在地圖上使用字符串函數(shù),并且文件末尾不包含\ 0,則很容易發(fā)生。當(dāng)文件大小不是頁面大小的倍數(shù)時,它將在大多數(shù)情況下工作,因?yàn)樽詈笠豁撎畛錇?(映射區(qū)域的大小始終為頁面大小的倍數(shù))。


查看完整回答
反對 回復(fù) 2019-07-23
  • 3 回答
  • 0 關(guān)注
  • 747 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號