2012-06-21 40 views
1

這是我的第一個問題。我不確定它是否偏離主題。爲什麼內存映射文件總是映射在頁面邊界?

雖然自學,我發現關於操作系統下面的語句:在頁面邊界被映射

操作系統,使內存映射文件總是需要的文件。例如,對於4 KB頁,文件可以在起始於虛擬地址映射到4096,而不是在開始虛擬地址5000

此語句以下列方式解釋:

如果文件可以映射到頁面中間,則單個虛擬頁面需要磁盤上的兩個部分頁面來映射它。第一頁,特別是 將映射到臨時頁面上,並且也映射到文件頁面上。處理頁面 錯誤,這將是一個複雜和昂貴的操作,需要複製 數據。此外,將無法捕獲對未使用部分頁面的引用。 由於這些原因,這是可以避免的。

我想問這個問題的答案。特別是,說「單個虛擬頁面需要磁盤上的兩個部分頁面來映射它」意味着什麼?根據我對內存映射文件的瞭解,虛擬頁面被映射到磁盤上的文件,而不是分頁文件。這是什麼意思的「部分頁面」?

此外,這裏的「scratch page」是什麼意思?我試圖在書籍(Tanenbaum的「現代操作系統」和「結構化計算機組織」)和Web上查找這個術語,但還沒有找到它。

回答

1

首先,在閱讀書籍和文檔時,總是要仔細觀察你所看到的內容。有時作者傾向於使用「沒有其他方式」這樣的語言來推廣他們正在描述的解決方案。其他方式總是可能的。

現在就此事。現代操作系統對於每個分配的內存頁面總是有一個磁盤位置。這是有道理的。一旦有必要丟棄內存中的頁面 - 如果該頁面處於「髒」狀態,則已經清除該頁面的位置,或者如果未修改則丟棄該頁面。這一戰略被廣泛接受。儘管其他政策也是可能的。

磁盤位置可以是分頁文件或內存映射文件。內存映射文件的最常見用法 - 可執行文件和dll。他們(幾乎)從未修改過。如果一段時間內沒有使用帶有代碼的頁面 - 請丟棄它。如果控制權會到達那裏 - 從文件中重新讀取它。

在您提到的摘要中,他們說would need two partial pages on disk to map it. The first page, in particular, would be mapped onto a scratch page。他們傾向於呈現像這裏只有一個解決方案的情況。實際上,可以在分頁文件中爲這種組合頁面分配頁面並處理適當的數據複製。頁面文件中也可能沒有任何內容,並使用瞬態頁面從文件中組裝此頁面。在99%的情況下,磁盤控制器只能從頁面邊界讀取/寫入。這意味着你需要從第一個文件讀到內存頁面,從第二個文件到瞬態頁面。從瞬時頁面複製數據並立即丟棄。

如您所見,完全可以在一個頁面中組合多個文件。這裏沒有原則問題。雖然用於處理此解決方案的算法將更加複雜,並且它們將消耗更多的CPU時鐘。重建這樣的頁面(如果它將被丟棄)將需要從幾個不同的文件中讀取。在我們這些日子裏,4kb的數量是相當小的。節省2kb並不是一個巨大的收益。在我看來,看看收益和成本,我會說收益不夠重要。

0

虛擬地址頁面(在我聽過的每臺機器上)都在頁面大小的邊界上對齊。這只是因爲它讓數學變得非常簡單。在x86上,頁面大小爲4096.這正好是12位。要確定一個地址指向哪個虛擬頁面,只需將地址右移12即可。如果要將磁盤塊(假定爲4096字節)映射到5000的地址,則它將從第1頁開始( 5000 >> 12 == 1)並在第2頁(9095 >> 12 == 2)處結束。內存映射文件通過映射虛擬地址空間塊到文件中工作,但數據按需加載(事實上,文件可能比物理內存大得多,可能不適合)。當您第一次訪問虛擬地址時,如果數據不存在(即它不在物理內存中)。處理器將發生故障,操作系統必須提取數據。當您獲取數據時,您需要獲取頁面的所有數據,否則您將無法關閉該錯誤。如果您沒有對齊地址,那麼您將不得不引入多個磁盤塊來填充頁面。你當然可以做到這一點,它只是混亂和低效率。