13.5 物理存儲器和頁交換文件

13.5  物理存儲器和頁交換文件

在老式的操作系統中,物理存儲器被認爲是機器中內存的總量。換句話說,如果一臺機器裝有16 MB內存,那麼應用程序最多可以使用16 MB內存。當今的操作系統能讓磁盤空間看起來像內存一樣。磁盤上的文件一般被稱爲頁交換文件(paging file),其中包含虛擬內存,可供任何進程使用

當然,爲了能夠使用虛擬內存,操作系統需要CPU的大力協助。當線程試圖訪問存儲器中的一個字節時,CPU必須知道該字節是在內存中還是在磁盤上。

從應用程序的角度來說,頁交換文件以一種透明的方式增大了應用程序可用內存(或存儲器)的總量。如果一臺機器裝備了1 GB的內存,硬盤上還有1 GB的頁交換文件,那麼應用程序會認爲可用內存的總量爲2 GB。

當然,這臺機器實際上並沒有裝備2 GB的內存。實際上,是操作系統與CPU分工協作,把內存中的一部分保存到頁交換文件中,並在應用程序需要的時候再將頁交換文件中的對應部分載入內存。因此,使用頁交換文件可以增大應用程序可用內存的總量。另一方面,頁交換文件的使用並不是必須的。如果一臺機器沒有頁交換文件,那麼對系統來說,它只是認爲可供應用程序使用的內存總量減少了。但是,我們強烈建議用戶使用頁交換文件,這樣就可以運行更多的應用程序,而應用程序也可以操作更多的數據。最好是把物理存儲器看成是保存在磁盤(通常是硬盤)上的頁交換文件中的數據。當應用程序調用VirtualAlloc函數來把物理存儲器調撥給地址空間區域時,該空間實際上是從硬盤上的頁交換文件分配得到的。系統中頁交換文件的大小是決定應用程序可用內存總量的最重要因素,機器實際裝備的內存總量對它的影響相對較小。

當一個線程試圖訪問所屬進程的地址空間中的一塊數據(位於第17章介紹的內存映射文件之外)時,有可能會出現兩種情況。圖13-2顯示了經簡化後的流程圖。(更多細節請參閱Mark Russinovich和David Solomon所著的Microsoft Windows Internals,由微軟出版社出版。)

第一種情況是,線程要訪問的數據就在內存中。在這種情況下,CPU會先把數據的虛擬內存地址映射到內存的物理地址,接下來就可以訪問內存中的數據了。

第二種情況是,線程要訪問的數據不在內存中,而是位於頁交換文件中的某處。在這種情況下,這次不成功的訪問被稱爲頁面錯誤。發生頁面錯誤時,CPU會通知操作系統。操作系統隨即在內存中找到一個閒置的頁面,如果找不到,操作系統必須先釋放一個已分配的頁面。如果待釋放的頁面沒有修改過,那麼操作系統可以直接釋放該頁面。但如果系統需要釋放一個修改過的頁面,那麼它必須先把頁面從內存複製到頁交換文件。接下來,系統會在頁交換文件中對所需訪問的數據塊進行定位,並把數據載入到內存中閒置的頁面。然後,操作系統對它內部的表項進行更新,以反映該塊數據的虛擬內存地址現在已經被映射到了內存中對應的物理內存地址。這時CPU會再次運行那條引發頁面錯誤的指令,但和前一次不同的是,這一次CPU能夠將虛擬內存地址映射到物理內存地址併成功訪問所需的數據。

 
圖13-2  把虛擬地址轉換爲物理存儲器地址

系統需要在內存和頁交換文件之間複製頁面的頻率越高,硬盤顛簸(thrash)得越厲害,系統運行得也越慢。(顛簸是指操作系統把所有的時間都花在在頁面文件和內存之間交換數據上,導致沒有時間運行程序。)通過給計算機添加更多的內存,我們可以減少應用程序運行時可能產生顛簸的次數,從而極大地提高應用程序的性能。這裏有一條經驗法則:要讓計算機跑得更快,最好是增加內存。實際上,和換個更快的CPU相比,添加內存在大多數情況下都會得到更好的性能提升。

不在頁交換文件中維護的物理存儲器

在讀過上一節之後,讀者可能會想,如果有許多程序同時運行,頁交換文件可能會變得相當大--尤其是每次運行一個程序時,系統都必須爲該進程的代碼和數據預訂地址空間區域,爲這些區域調撥物理存儲器,然後把硬盤上的程序文件中的代碼和數據複製到頁交換文件中已調撥的物理存儲器中去。

事實上,系統並不會執行剛纔所說的這些操作。如果系統確實這麼做的話,那麼載入一個程序並讓它運行起來會花費很長的時間。當用戶要求執行一個應用程序時,系統會打開該應用程序對應的.exe文件並計算出應用程序的代碼和數據的大小。然後系統會預訂一塊地址空間,並註明與該區域相關聯的物理存儲器就是.exe文件本身。是的,系統並沒有從頁交換文件中分配空間,而是將.exe文件的實際內容(或文件映像,即file image)用作程序預訂的地址空間區域。這樣一來,不但載入程序非常快,而且頁交換文件也可以保持一個合理的大小。

當把一個程序位於硬盤上的文件映像(即一個.exe或DLL文件)用作地址空間區域對應的物理存儲器時,我們稱這個文件映像爲內存映射文件(memory mapped file)。當載入一個.exe或DLL時,系統會自動預訂地址空間區域並把文件映像映射到該區域。但是,系統也提供了一組函數,可以讓開發人員把數據文件映射到地址空間。我們會在第17章詳細討論內存映射文件。

Windows可以使用多個頁交換文件。如果多個頁交換文件位於不同的物理硬盤上,那麼系統就可以運行得更快,這是因爲系統能同時寫入多個硬盤。在控制面板裏,我們可以通過以下步驟來添加和刪除頁交換文件。

(1)選擇Performance Information And Tools(性能信息和工具)。

(2)單擊Advanced Tools(高級工具)鏈接。

(3)單擊Adjust The Apperance And Performance Of Windows(調整Windows的外觀和性能)鏈接。

(4)選擇Advanced(高級)選項卡,並在虛擬內存部分單擊Change(更改)按鈕。

下圖顯示了彈出的對話框。

 

說明  當Windows從軟盤載入.exe或DLL文件時,系統會把整個文件從軟盤複製到內存中。此外,系統還會從頁交換文件中分配足夠的存儲空間來存放文件映像。只有當系統需要把一個頁面換出內存,而頁面又包含該文件映像的一部分時,系統纔會寫入頁交換文件。如果系統的內存負載很輕,那麼文件總是從內存中直接運行。

Microsoft必須讓在軟盤上執行的文件以這種方式運行,因爲只有這樣安裝程序才能正常運行。通常,安裝程序從第一張軟盤開始運行,在安裝過程中用戶會取出該軟盤並插入其他軟盤。如果系統需要再從第一張軟盤去加載.exe或DLL的一部分代碼,那麼很顯然,第一張軟盤可能已經不在軟驅內了。但是,由於系統已經把文件複製到了內存中(並以頁交換文件爲後備存儲器),因此係統可以隨時訪問安裝程序而且不會遇到任何問題。

除非映像文件是用/SWAPRUN:CD或/SWAPRUN:NET開關鏈接的,否則系統不會把位於其他可移動媒介(比如,光盤或網絡驅動器)上的映像文件複製到內存中的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章