簡體   English   中英

mmap 是如何工作的?

[英]How does mmap work?

我正在研究 Linux 中的程序,這些程序需要硬盤中的 mmap 文件,但我有一個問題,什么會導致它失敗。 就像如果所有的記憶都是碎片化的,每個只有200M,但我想將一個文件映射到一個1000M的memory,它會成功嗎?

還有一個問題,linux 中是否有任何工具可以像 Windows 中的一些工具一樣回憶 memory,例如 xp 的內置工具。

謝謝。

mmap()使用程序堆區域之外的地址,因此堆碎片不是問題,除非它可以使堆占用更多空間,並減少映射的可用空間。

如果您有大量映射文件,您可能會在地址空間相對受限的 32 位系統上遇到碎片問題。 在 64 位系統上,碎片不太可能成為問題,因為即使現有映射之間只有很小的可用區域,仍然有大量可用的連續地址空間,與現有映射相鄰。

在 32 位系統上更常見的問題是地址空間太小,根本無法容納 map 大文件。 在 4GB 地址空間中,通常 2GB 可用於用戶空間,另外 2GB 由 kernel 保留。 在可用的 2GB 中,您的映射必須與程序的代碼和堆棧(通常很小)和堆(可能很大)共享空間。

簡而言之,如果文件太大, mmap()在 32 位系統上通常會失敗,但在 64 位系統上,您不太可能有足夠大的文件導致該問題。

如果您正在創建私有寫時復制映射,它也可能由於缺少交換空間而失敗。 kernel 必須確保可用 RAM 和交換的總和足夠大以容納映射的大小,以防您修改所有頁面,以便 kernel 被迫制作它們的私有副本。 共享映射不應該有這個問題,因為更改可以刷新到磁盤上的文件,然后如果 memory 稀缺並稍后從磁盤重新加載,則可以丟棄頁面。

當然,如果您沒有訪問文件的權限,或者如果它不是可以映射的文件類型(例如目錄或套接字),映射也可能會失敗。

不清楚你說的回憶memory是什么意思。 請記住, mmap()消耗的稀缺資源不是 memory,而是地址空間 即使機器實際上只有 128MB 的 RAM,你也可以 map 一個 1GB 的文件,但是在 32 位系統上,即使機器有 16GB 的 RAM,你也不能 map 一個 4GB 的文件。

虛擬 memory的概念對於理解mmap()的作用至關重要,所以如果您還不熟悉它,請閱讀它。

mmap通過操作進程的頁表來工作,頁表是 CPU 用於 map 地址空間的數據結構。 CPU 會將“虛擬”地址轉換為“物理”地址,並根據您的 kernel 設置的頁表執行此操作。

當您第一次訪問映射的 memory 時,您的 CPU 會產生page fault 然后操作系統 kernel 可以跳入,通過分配 memory 並在新分配的緩沖區中執行文件 I/O 來“修復”無效的 memory 訪問權限,然后繼續執行您的程序,如果什么都不做

如果您的進程超出地址空間,則mmap可能會失敗,這些天對於 32 位代碼需要注意,其中所有可用地址都可以很快地映射到大型數據集。 它也可能因手冊頁的“錯誤”部分中提到的任何事情而失敗。

如果 kernel 在分配 memory 或執行 I/O 時出現問題,則在映射區域內訪問 memory 也會失敗。 在這種情況下,您的進程將獲得一個SIGBUS信號

簡短的回答是:這取決於。

根據您擁有的 memory 的數量、您工作的環境或訪問映射的方式, mmap可能會以多種方式失敗。 閱讀 mmap 的手冊頁以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM