Linux mmap記憶體映射

來源:互聯網
上載者:User

Linux系統調用mmap和mmap2,建立一個進程地址空間的映射,mmap/mmap2幾個常用的情境:

1. 檔案對應普通檔案I/O操作,讀寫mmap映射後的記憶體,即可完成檔案的讀寫操作,kernel和userspace操作同一塊實體記憶體;而常規的檔案讀寫,需要迴圈調用read write lseek介面,每一次讀寫都需要kernel到userspace,或者userspace到kernel的記憶體拷貝。因此mmap方式操作提升了檔案訪問速度。但是mmap映射由於佔用了大量記憶體將影響其他動作所能使用的記憶體數量(儘管kernel會在記憶體緊缺的時候回收記憶體)。

如果要映射的檔案很大,最好的做法是對檔案進行分段映射,雖然linux進程的線性地址空間很大,但是仍然有限。

2. 使用mmap匿名映射,在調用mmap時,設定一個特殊的標誌MAP_ANONYMOUS。匿名映射可以用來分配較大的記憶體區,userspace可以顯示的調用mmap分配記憶體;此外,libc中使用malloc分配記憶體時,如果申請的記憶體是一小塊記憶體(比如小於某一個臨界值),malloc會調用brk從進程地址空間的堆分配記憶體,否則直接調用mmap/mmap2分配記憶體。

在核心中,brk的實現實際上是簡化版本的do_mmap實現,brk假定線性區不映射磁碟上的檔案。

3. 共用記憶體映射。主要用於進程間通訊,對於映射的任何修改,對其他映射這個檔案的進程都是可見的,並且修改結果都會反映到下面的檔案。和管道,訊息佇列等進程通訊方式,共用記憶體效率更高。

mmap和mmap2

C標準庫使用統一的函數入口mmap函數來建立映射,mmap的C庫實現會選擇mmap或者mmap2來進行實際的映射建立。

在kernel系統調用級則提供了兩個系統調用 mmap和mmap2。mmap和mmap2的區別在於參數offset,這個參數指定了檔案對應的起始位置,對於mmap單位是bytes,而對於mmap2單位則是PAGE_SIZE

MAP_LOCKED和MAP_UNLOCKED

MAP_LOCKED使得進程虛擬位址空間映射的page不再處於缺頁狀態,某些情況下不希望訪問線性地址被交換到交換空間。

MAP_UNLOCKED的作用正好相反

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.