mmap映射大于4g的文件_浅谈mmap_刘伟
生活随笔
收集整理的這篇文章主要介紹了
mmap映射大于4g的文件_浅谈mmap_刘伟
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
奇技指南
作者說:最近在工作中遇到一個mmap使用相關的問題,造成了一定的困惑,于是花了些時間補了下 mmap的功課,在這里分享給大家,錯誤和不足之處大家多指教。
相關背景知識
- 說到mmap的使用,我們首先要了解一下進程的虛擬進程地址空間的概念。Linux上為了作進程隔離,每個進程都運行在自己的單獨的虛擬進程空間,同時物理機上內(nèi)存有限,每個進程使用虛擬內(nèi)存地址來隔離又共享物理內(nèi)存。我們平時在代碼里獲取的地址就是虛擬地址;
- 放一張進程虛擬地址空間草圖,網(wǎng)上也可以很容易找到更精美的
- 我們在程序中申請內(nèi)存的操作,實際上只是在進程地址空間相應部分申請了一段虛擬地址,當實際對這段虛擬地址進行讀寫操作時,才會分配真正的物理內(nèi)存;
- 通常x86 Linux采用段頁式的內(nèi)存管理模式,這塊不具體展開,簡單來說就是CPU訪問的邏輯地址,然后經(jīng)過分段機制轉(zhuǎn)換成線性地址(你可以簡單理解成等價于上面說的虛擬地址),再經(jīng)過分頁機制轉(zhuǎn)換成物理地址,第一次訪問的時候由于實現(xiàn)物理地址還沒有分配,會產(chǎn)生缺頁中斷來分配物理地址,用它來填充對應的頁表項;
- 通過read系統(tǒng)調(diào)用來讀取磁盤上的文件時,文件內(nèi)容會先被讀到內(nèi)存的page cache部分,然后再從page cache中拷貝到應用層的讀緩存buffer中;對于打開的文件,內(nèi)核都會在內(nèi)存中維護一個inode結構體(對于同一個文件,即使被open多次,內(nèi)核也僅維護這一個inode),其有一個成員是struct address_space*i_mapping , 它用來維護這個文件被讀取的所有部分在內(nèi)存中的緩存,其使用xarray(全新封裝了基數(shù)樹的操作)來存儲這個物理頁(struct page), 如下圖:
mmap簡介
- 先看原型:void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
- 功能:
mmap的幾種典型應用
- 不同進程(可以是非父子進程)間共享映射
- 非子進程間通訊
- 進程通過 mmap 來讀寫文件
- 用作glibc中malloc申請內(nèi)存
- mmap的寫時拷貝
mmap作磁盤文件映射時的特別說明
- mmap映射的虛擬地址長度(即mmap的第二個參數(shù))需要對齊到物理頁大小,在32位系統(tǒng)上通常是4K, 這一特點會導致一些有趣的事情發(fā)生,我們來看一下:假如一個文件的大小是5000Byte, 剛好比4K大一些,我們用mmap來從文件開始的位置來映射它,mmap的第二個參數(shù)給5000, 因為需要頁面對齊,實現(xiàn)映射的虛擬地址長度將是兩個4k,即8192, 8192 - 5000 = 3192的部分用0填充,也是可以被訪問到;
- 如果用mmap映射某個文件時,這個文件大小為0, 不會分配任何的物理內(nèi)存,也不能作任何的讀寫訪問;當向文件中寫入數(shù)據(jù)后,通過mmap返回的虛擬地址可以訪問這部分文件內(nèi)容;
mmap與內(nèi)存換入換出
- 由前面的介紹我們知道m(xù)map不管是映射磁盤文件,還是作匿名映射,最終都會分配物理內(nèi)存頁,因此這個物理內(nèi)存頁在內(nèi)存緊張時就有備換出的可能,當然mmap提供了MAP_LOCKED,可以鎖定內(nèi)存不被換出,我們不考慮這種情況;
- 如果使用mmap映射的是磁盤文件,其存在物理頁的內(nèi)容會被清空,pte將記錄這種情況,再次需要訪問時,會重新讀取磁盤文件,緩存在page cache中;
- 如果使用mmap作匿名映射,沒有相關聯(lián)的磁盤文件(或者使用MAP_PRIVATE方式映射磁盤文件),發(fā)生內(nèi)存換出時,將被交換到swap中,swap實際上也對應著磁盤塊,最終也是寫在磁盤上;
關于360技術:360技術是360技術團隊打造的技術分享公眾號,每天推送技術干貨內(nèi)容,更多技術信息歡迎關注“360技術”微信公眾號
總結
以上是生活随笔為你收集整理的mmap映射大于4g的文件_浅谈mmap_刘伟的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文明礼仪宣传口号文案28句
- 下一篇: 女人宠爱自己的唯美句子 自己宠爱自己的说