2015-12-14 67 views
0

我無法理解文件在內存映射I/O中的管理方式。正常如果我們使用open或fopen打開文件,它將分別返回fd或 文件指針。在這之後打開文件駐留處理。它在內存中(在硬盤中的文件的副本)還是不在?如果 不在通過隨後的讀取或寫入系統調用獲取數據的內存中,或者每次調用讀取或寫入時從硬盤讀取數據。 否則,該文件的副本將存儲在內存中,並且進程將訪問該文件以進一步操作,一旦該進程完成,該文件將被複制到硬盤。在上述概念 哪個場景有效?Unix中的內存映射I/O

以下是記憶中給出的定義映射I/O在Unix的環境(第2版)本書高級編程:

內存映射I/O讓我們在磁盤上的文件映射到緩衝區在內存中,這樣,當我們從緩衝區中獲取字節時,讀取文件的相應字節。同樣,當我們將數據存儲在緩衝區中時,相應的字節會自動寫入文件。這使我們可以在不使用讀取或寫入的情況下執行I/O。

什麼是將文件映射到內存?在這裏,他們定義的內存被放置在棧和堆之間。在這個存儲器中,映射文件後會出現什麼樣的數據類型。它包含文件的副本或駐留在硬盤上的文件的地址。和 上述情況如何成爲現實。

有沒有人解釋內存映射I/O和mmap功能的工作機制?

+1

驅動程序...................................... –

+0

這意味着什麼?我正在使用Ubuntu 12.04 – mrg

+0

閱讀[page cache](https://en.wikipedia.org/wiki/Page_cache)&http://linuxatemyram.com/&[虛擬地址空間](https://en.wikipedia .org/wiki/Virtual_address_space) –

回答

3

通常,當您打開文件時,系統會設置一些簿記結構(元數據),但不需要讀取文件實際數據的任何部分。當您撥打read()時,系統會將文件的一部分加載到您爲此目的分配的(虛擬)存儲器中。

當您對文件進行內存映射時,系統會重新設置記錄,並且還會設置一個(虛擬)內存「映射」,這意味着一系列有效地址,如果使用它將反映讀取(或寫入)的底層文件。這並不意味着整個文件需要一次讀取,因爲它可以按需「分頁」,即系統可以給你一個地址範圍來使用,然後等待你真正使用它,然後在那裏加載任何數據。這種「頁面錯誤」由稱爲存儲器管理單元(MMU)的硬件設備支持。當您運行可執行文件時使用相同的系統 - 系統可以將其映射到虛擬內存並僅根據需要從磁盤讀取頁面(塊)。

+0

有效地址的範圍是什麼。是在硬盤上的文件的地址? – mrg

+0

不,它是「虛擬內存」中的一個地址範圍,它是一個每進程的概念,這意味着該數字對於它的「虛擬內存」進程只有意義。一個進程可能將0x2000看作一個對象,而另一個進程可能看到完全相同的虛擬地址0x2000。磁盤上的文件沒有相同的平面/線性意義上的「地址」 - 這是操作系統的工作,以隱藏這個事實。 –

+0

我喜歡將它與「交換文件」的對比:) – 0xC0000022L

1

它在內存中(在硬盤中的文件的副本)或不是?

根據Computer Programming and Utilization,當你用fopen打開文件時,它的內容被加載到內存中。 (部分或全部)。

如果不是在內存中的數據是由隨後的讀或 寫系統調用獲取

當你使用fwrite一些數據,它最終被複制到內核,然後將其寫入磁盤(或任何地方)緩衝後。通常,文件的任何部分都不需要加載才能寫入。

what is mapping a file into memory? enter image description here有關詳細參閱here

在這個存儲器中,數據的類型是映射文件之後存在。它 包含該文件的副本或位於 硬盤中的文件的地址。

存儲器映射文件是已經分配與文件或類似文件的resource.Refer this

的一些部分直接字節對字節相關的虛擬存儲器的段有可能將文件映射到內存區域。完成此操作後,可以像訪問程序中的數組一樣訪問該文件。這比讀取或寫入效率更高,因爲只有程序實際訪問的文件區域被加載。訪問mmapped區域尚未加載的部分與換出頁面的處理方式相同。

+0

通常,當使用fwrite/fprintf/etc而不是在內核中時,libc會緩衝userland中的數據。此外,數據通常不會複製到內核中,而是直接通過DMA從用戶空間位置寫入 – Ctx

+0

讀取數據時? – mrg

+0

更新答案:-) –

0

此後打開文件駐留處理。它在內存中(在硬盤中的文件的副本)還是不在?

在磁盤上。如果操作系統執行預讀操作,但也可能是部分或完全在內存中,但這是不可檢測的。您仍然必須發出讀取以從文件中獲取數據。

如果不是在內存中的數據是由隨後的讀取或寫入系統調用

從磁盤讀取。

或它每次調用讀取或寫入時從硬盤讀取數據。

實際上,但你也必須考慮任何緩存的影響。

否則,該文件的副本存儲在內存中,該文件被進程進行訪問以進一步操作,一旦該進程完成,該文件被複制到硬盤。

否。文件的行爲就好像它全部在磁盤上一樣。

而在這裏,他們定義的內存被放置在棧和堆之間。

不是你所引用的。

在此存儲器中,映射文件之後存在什麼類型的數據。

該文件中的數據。 「什麼類型的數據」這個問題沒有意義。數據是數據。

它包含文件的副本或駐留在硬盤上的文件的地址。

它實際上包含該文件的副本。

以上情況如何成立。

通過虛擬內存。這裏覆蓋的太廣了。