淺談對於虛擬內存的一些認識


  虛擬內存對於操作系統來說是非常重要的,它是用於當做內存來彌補計算機物理內存空間缺乏的硬盤空間。當實際內存耗盡時(在內存耗盡之前),虛擬內存就在硬盤上創建了。當物理內存耗盡後,虛擬內存管理器選擇最近沒有用過的,低優先級的內存部分寫到交換文件上。這個過程對應用是隱藏的,在應用看來虛擬內存和實際內存沒啥區別。
  系統啓動時會把所有的內存進行初始化,建立數據結構對內存進行分頁。這些動作是實現虛擬內存的前提。那怎樣實現虛擬內存呢?將內存頁放到非物理內存的存儲介質上,通常這些存儲介質是硬盤,這些內存頁存儲在硬盤的頁面文件中,比如Linux系統中的交換分區swap和Windows系統文件中虛擬內存文pagefile.sys。但對於應用程序認爲這些內存頁是內存的一部分,硬盤上的扇區如何變成內存對於應用程序都是透明的。
  但對於操作系統而言這樣的轉換不可能是透明的,除非CPU自己能完成和所有外圍設備(包括硬盤)的交互。爲了實現對虛擬內存的訪問,CPU提供了新的異常中斷,由操作系統負責實現中斷處理程序。大致過程如下,
CPU經過計算得到了所要訪問地址的內存頁,
1、該內存頁存在於物理內存,直接訪問。
2、該內存頁不在物理內存中,訪問不到。因爲CPU沒有能力讀取硬盤,只能觸發異常中斷,操作系統發現異常中斷事件後會將在硬盤上的內存頁讀到物理內存中。首先操作系統在找到空閒物理內存,從硬盤上讀出並寫入物理內存中;然後修改頁表,將頁表標定與當前物理內存關聯;由於發生中斷導致後面代碼無法繼續執行,CPU會在中斷返回之後重新執行發生錯誤的彙編代碼。
  這裏會遇到一個問題,就是有限物理內存沒有空閒時,操作系統系統的虛擬內存調度程序會將各個進程中一部分暫時不用的內存換出到頁面文件(交換分區)中,並將需要訪問內存的程序的內容從頁面文件中換入到那部分被標定爲空閒的物理內存。這就是通常所說的Page Out操作。當這樣的操作頻繁發生時會對系統性能產生很大影響。對於虛擬內存計算調度,Page Out操作的優化會在以後進行補充。
還有一個問題需要說明,有些內存頁是不能交換到硬盤上。例如,當CPU預讀的數據不存在物理內存中,發生中斷異常進行Page Out動作。處理這個中斷也需要有一段代碼,當CPU試圖運行這段代碼時它發現這段代碼也不在物理內存中,接下來系統將沒辦法進行下去了。
  在操作系統中這樣的應用還有很多,它們不能被放到硬盤上,必須保證永遠在物理內存中運行。因此引出了分頁池/非分頁池 (Paged Pool/Non-Paged Pool)的概念。系統會保證那些必須使用Non-Paged Pool的應用以便保證不會出現上面的問題。
下面是一段對Paged Pool/Non-Paged Pool的描述:
The paged pool is exactly what its name implies: a region of virtual memory that is subject to paging. The size of the paged pool is limited and depends . both the amount of available physical memory . each individual machine and the specific operating system release. For example, the maximum size of the paged pool is about 491 MB . 32-bit hardware running Windows XP and about 650 MB . Windows Server 2003 SP1.
The nonpaged pool is a region of system virtual memory that is not subject to paging. Drivers use the nonpaged pool for many of their storage requirements because it can be accessed at any IRQL. Like the paged pool, the nonpaged pool is limited in size. . a 32-bit x86 system that is started without the /3GB switch, the nonpaged pool is limited to 256 MB; with the /3GB switch, the limit is 128 MB. . 64-bit systems, the nonpaged pool currently has a limit of 128 GB.
  在上面的一段描述中提到了“/3GB switch”這個概念,這是Windows系統中的一個內存開關,這就涉及到Windows如何使用大內存的問題。
  我在“Windows如何提供大內存支持”中會對它有詳細的介紹。


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