2017-04-25 37 views
1

我想了解read()和MMAP()之間的特定差異。我對這兩方面都有一個基本的或正確的理解,但有一些基本的東西我沒有得到。不讀的Linux()將數據複製到進程的地址空間

我猜想答案就在這裏很簡單,但這裏的問題:

比方說,你打開一個文件「的test.txt」,這是不存在的文件緩存和你想讀前64個字節。我的理解是,首字節4k被讀入頁面緩存,然後64字節被複制到read()調用的緩衝區中。

我的問題:

1)當你在通過讀取數據的讀取()和4K存儲在文件系統緩存中,確實會佔用你的進程的虛擬內存地址空間,或者是隻是磁盤緩存空間可能/將在稍後被調出?我知道mmap會將文件(或文件的一部分)映射到進程地址空間,但我無法弄清楚read()是否使用進程地址空間。我的猜測是,它不是因爲read()不允許你隨機訪問文件的一部分(是否正確?)。

2)即該被複制到由讀取返回的緩衝器64個字節()要由該方法中使用,執行此數據佔用進程的地址空間,或只是磁盤空間緩存?

回答

1

我的理解是,第一個4k的字節被讀入頁面緩存,然後64個字節被複制到read()調用的緩衝區中。

一般情況下,這是正確的。 (但總有例外 - 在這種情況下direct I/O你真的從來不用擔心那麼多,除非你正在處理一些I/O角落的情況下...。)

當你閱讀通過read()和4k的數據存儲在文件系統緩存中,是否會佔用進程的虛擬內存地址空間,或者只是磁盤緩存空間可能會在稍後被分頁?

後者 - 磁盤緩存是內核空間中的內存,它可以緩存磁盤上的數據內容。它可以被分頁(就像大多數頁面的內存一樣)。

這64個字節被複制到read()返回的緩衝區中,以供進程使用,這個數據佔用進程地址空間還是磁盤空間緩存?

將數據從磁盤緩存(內核內存)複製到用戶空間的緩衝區中。所以數據在兩個地方。 (這是直接I/O的理由 - 額外副本步驟和數據本身的額外副本被消除)

I/O性能是一個複雜的課題。在一種情況下,最快的速度在另一種情況下可能不是最快的。從CPU速度到內存帶寬,PCI總線帶寬,磁盤控制器特性,到SATA/SAS/SCSI/FC/iSCSI帶寬以及延遲到實際物理磁盤性能細節的所有內容都非常重要。 數據是如何佈置在磁盤上的。 如何訪問數據事宜。幾乎不可能說明mmap()read()快 - 或者相反。

思考越來越類似於阻抗的高端音響系統的最佳音質揚聲器相匹配的最佳I/O性能,但是影響的「最佳」答案一大堆更多的變數。要獲得絕對最佳的性能,一切必須匹配 - 從物理磁盤(或多個)上的數據的實際佈局的確切模式(S)用戶空間應用程序使用來訪問數據。

而且一般來說這並不值得打擾 - 幾乎所有開箱即用的設置都會讓您至少達到硬件所能達到的最大性能的80%左右,只要您不需要做不好的事情就像一次只讀一個字符反向文件。

相關問題