A. 什麼是虛擬存儲器和局部性原理
虛擬存儲器:是指具有請求調入功能和置換功能,能從邏輯上對內存容量進行擴充的一種存儲器系統。在虛擬存儲器系統中,作業無需全部裝入,只要裝入一部分就可運行。
引入虛擬存儲技術之後,可以:
1、提高內存利用率;(如:定義100*100大小的數組,可能只用到10*10個元素)
2、程序不再受現有物理內存空間的限制;編程變得更容易;
3、可以提高多道程序度,使更多的程序能夠進入內存運行。程序局部性原理:虛擬存儲管理的效率與程序局部性程序有很大關系。根據統計,進程運行時,在一段時間內,其程序的執行往往呈現出高度的局限性,包括時間局部性和空間局部性。
1、時間局部性:是指若一條指令被執行,則在不久的將來,它可能再被執行。
2、空間局部性:是指一旦一個存儲單元被訪問,那它附近的單元也將很快被訪問。
B. 系統虛擬內存的工作原理
內存在計算機中的作用很大,電腦中所有運行的程序都需要經過內存來執行,如果執行的程序很大或很多,就會導致內存消耗殆盡。為了解決這個問題,Windows中運用了虛擬內存技術,即拿出一部分硬碟空間來充當內存使用,當內存佔用完時,電腦就會自動調用硬碟來充當內存,以緩解內存的緊張。舉一個例子來說,如果電腦只有128MB物理內存的話,當讀取一個容量為200MB的文件時,就必須要用到比較大的虛擬內存,文件被內存讀取之後就會先儲存到虛擬內存,等待內存把文件全部儲存到虛擬內存之後,跟著就會把虛擬內里儲存的文件釋放到原來的安裝目錄里了。下面,就讓我們一起來看看如何對虛擬內存進行設置吧。
虛擬內存的設置
對於虛擬內存主要設置兩點,即內存大小和分頁位置,內存大小就是設置虛擬內存最小為多少和最大為多少;而分頁位置則是設置虛擬內存應使用那個分區中的硬碟空間。對於內存大小的設置,如何得到最小值和最大值呢?你可以通過下面的方法獲得:選擇「開始→程序→附件→系統工具→系統監視器」(如果系統工具中沒有,可以通過「添加/刪除程序」中的Windows安裝程序進行安裝)打開系統監視器,然後選擇「編輯→添加項目」,在「類型」項中選擇「內存管理程序」,在右側的列表選擇「交換文件大小」。這樣隨著你的操作,會顯示出交換文件值的波動情況,你可以把經常要使用到的程序打開,然後對它們進行使用,這時查看一下系統監視器中的表現值,由於用戶每次使用電腦時的情況都不盡相同,因此,最好能夠通過較長時間對交換文件進行監視來找出最符合您的交換文件的數值,這樣才能保證系統性能穩定以及保持在最佳的狀態。
找出最合適的范圍值後,在設置虛擬內存時,用滑鼠右鍵點擊「我的電腦」,選擇「屬性」,彈出系統屬性窗口,選擇「性能」標簽,點擊下面「虛擬內存」按鈕,彈出虛擬內存設置窗口,點擊「用戶自己指定虛擬內存設置」單選按鈕,「硬碟」選較大剩餘空間的分區,然後在「最小值」和「最大值」文本框中輸入合適的范圍值。如果您感覺使用系統監視器來獲得最大和最小值有些麻煩的話,這里完全可以選擇「讓Windows管理虛擬內存設置」。
調整分頁位置
Windows 9x的虛擬內存分頁位置,其實就是保存在C盤根目錄下的一個虛擬內存文件(也稱為交換文件)Win386.swp,它的存放位置可以是任何一個分區,如果系統盤C容量有限,我們可以把Win386.swp調到別的分區中,方法是在記事本中打開System.ini(C:\Windows下)文件,在[386Enh]小節中,將「PagingDrive=C:WindowsWin386.swp」,改為其他分區的路徑,如將交換文件放在D:中,則改為「PagingDrive=D:Win386.swp」,如沒有上述語句可以直接鍵入即可。
而對於使用Windows 2000和Windows XP的,可以選擇「控制面板→系統→高級→性能」中的「設置→高級→更改」,打開虛擬內存設置窗口,在驅動器[卷標]中默認選擇的是系統所在的分區,如果想更改到其他分區中,首先要把原先的分區設置為無分頁文件,然後再選擇其他分區。
或者,WinXP一般要求物理內存在256M以上。如果你喜歡玩大型3D游戲,而內存(包括顯存)又不夠大,系統會經常提示說虛擬內存不夠,系統會自動調整(虛擬內存設置為系統管理)。
如果你的硬碟空間夠大,你也可以自己設置虛擬內存,具體步驟如下:右鍵單擊「我的電腦」→屬性→高級→性能 設置→高級→虛擬內存 更改→選擇虛擬內存(頁面文件)存放的分區→自定義大小→確定最大值和最小值→設置。一般來說,虛擬內存為物理內存的1.5倍,稍大一點也可以,如果你不想虛擬內存頻繁改動,可以將最大值和最小值設置為一樣。
44》虛擬內存使用技巧
對於虛擬內存如何設置的問題,微軟已經給我們提供了官方的解決辦法,對於一般情況下,我們推薦採用如下的設置方法:
(1)在Windows系統所在分區設置頁面文件,文件的大小由你對系統的設置決定。具體設置方法如下:打開"我的電腦"的"屬性"設置窗口,切換到"高級"選項卡,在"啟動和故障恢復"窗口的"寫入調試信息"欄,如果你採用的是"無",則將頁面文件大小設置為2MB左右,如果採用"核心內存存儲"和"完全內存存儲",則將頁面文件值設置得大一些,跟物理內存差不多就可以了。
小提示:對於系統分區是否設置頁面文件,這里有一個矛盾:如果設置,則系統有可能會頻繁讀取這部分頁面文件,從而加大系統盤所在磁軌的負荷,但如果不設置,當系統出現藍屏死機(特別是STOP錯誤)的時候,無法創建轉儲文件 (Memory.dmp),從而無法進行程序調試和錯誤報告了。所以折中的辦法是在系統盤設置較小的頁面文件,只要夠用就行了。
(2)單獨建立一個空白分區,在該分區設置虛擬內存,其最小值設置為物理內存的1.5倍,最大值設置為物理內存的3倍,該分區專門用來存儲頁面文件,不要再存放其它任何文件。之所以單獨劃分一個分區用來設置虛擬內存,主要是基於兩點考慮:其一,由於該分區上沒有其它文件,這樣分區不會產生磁碟碎片,這樣能保證頁面文件的數據讀寫不受磁碟碎片的干擾;其二,按照Windows對內存的管理技術,Windows會優先使用不經常訪問的分區上的
頁面文件,這樣也減少了讀取系統盤里的頁面文件的機會,減輕了系統盤的壓力。
(3)其它硬碟分區不設置任何頁面文件。當然,如果你有多個硬碟,則可以為每個硬碟都創建一個頁面文件。當信息分布在多個頁面文件上時,硬碟控制器可以同時在多個硬碟上執行讀取和寫入操作。這樣系統性能將得到提高。
小提示:
允許設置的虛擬內存最小值為2MB,最大值不能超過當前硬碟的剩餘空間值,同時也不能超過32位操作系統的內存定址范圍——4GB
滑鼠右擊「我的電腦」,選「屬性」,點「高級」標簽,點「性能」框的「設置」,再點「高級」標簽,點「虛擬內存」框的「更改」,點「自定義大小」,再將虛擬內存的數字范圍提高一點,(就改為最小值600最大值1000)再點旁邊的「設置」,再點「確定」便可。
虛擬內存不足,其實是不關你的內存的事的。虛擬內存是從硬碟里提取的存儲空間。當你在運得游戲或是運行大量的程序的時候,由於你的內存空間太小,以至於要用到大量的虛擬內存來幫助。
虛擬內存的工作原理是,當接收到一部分信息時,會解決當前的信息,然在處理過程中,又收到另外一個信息,虛擬內存則會把數據作為一個分頁存儲在硬碟當中,以便處理完上一次信息後,從中取出這一次的信息進行處理。但是由於硬碟中的分頁碎片不斷的壘積,垃圾文件就過於的多拉。所以原先定放的虛擬內存空間就顯得不足了。
通常虛擬內存的設置分為兩的極。即最大值和最小值。
通常人們設定虛擬內存是根據自己實際內存的大小來設定的。最小值應設為實際內存的1。5倍而最大值應設為實際內存的倍。比如說。你現在的虛擬內存是128M,則虛擬內存的范圍則可以設置為:最小值:128*1.5=192M。最大值:128*2=256M。當然還有更容易的。你可以用優化大師這款軟體。它可以根據你的實際內存來精算出你的虛擬內存的最佳設置范圍。
最後我要補充一點的是,你應該隔一段時間就清理虛擬內存里的分頁碎片。養成良好的清理習慣。(優化大師里有這樣的全面功能)要不然即使你的虛擬內存設置的再大也會被垃圾數據填充。
C. 虛擬存儲管理的基本原理是什麼
虛擬存儲器的概念 為解決內存小而作業大、作業多的矛盾, 以及執行過程中只是把當前運行需要的那部分程序和數據裝入內存。 所以,操作系統把各級存儲器統一管理起來。
就是說, 應該把一個程序當前正在使用的部分放在內存, 而其餘部分放在磁碟上,就啟動執行它。
操作系統根據程序執行時的要求和內存的實際使用情況, 隨機地對每個程序進行換入/換出。 這樣, 就給用戶提供一個比正式的內存空間大的多的地址空間, 這就是虛擬存儲器。
所謂虛擬存儲器是用戶能作為可編址內存對待的存儲空間, 在這種計算機系統中虛地址被映射成實地址。
簡單地說,虛擬存儲器:是由操作系統提供的一個假想的特大存儲器。
就是說, 虛擬存儲器並不是實際的內存,它的大小比內存空間大的多;
用戶感覺所能使用的「內存」非常大, 但這是操作系統對物理內存的擴充。 它的物質基礎是:
二級存儲器結構、和動態地址轉換(DAT)。
機構虛擬存儲器的基本特徵:
虛擬擴充。 虛擬存儲器不是物理上擴充內存空間, 而是邏輯上擴充了內存容量。 部分裝入。
每個作業不是全部一次的裝入內存, 而是分成若幹部分。 離散分配。 一個作業分成多個部分,沒有全部裝入內存。
即使裝入內存的那些部分也不必佔用連續的內存空間, 而是「見縫插針」。 多次對換。
在一個進程運行期間, 它所需的全部程序和數就要分成多次調入內存。
注意:
虛擬存儲器的容量雖然提供了特大的地址空間, 用戶在編程時一般不應考慮可用空間有多大。 但是, 虛擬存儲器的容量不是無限大的。
它主要受兩方面的限制:
(1)機器指令中表示地址的二進制數是有限的;
(2)外存的容量也是有限的。
D. 虛擬存儲器基於什麼原理
虛擬存儲器的概念
為解決內存小而作業大、作業多的矛盾, 以及執行過程中只是把當前運行需要的那部分程序和數據裝入內存。 所以,操作系統把各級存儲器統一管理起來。就是說, 應該把一個程序當前正在使用的部分放在內存, 而其餘部分放在磁碟上,就啟動執行它。操作系統根據程序執行時的要求和內存的實際使用情況, 隨機地對每個程序進行換入/換出。
這樣, 就給用戶提供一個比正式的內存空間大的多的地址空間, 這就是虛擬存儲器。所謂虛擬存儲器是用戶能作為可編址內存對待的存儲空間, 在這種計算機系統中虛地址被映射成實地址。簡單地說,虛擬存儲器:是由操作系統提供的一個假想的特大存儲器。就是說, 虛擬存儲器並不是實際的內存,它的大小比內存空間大的多; 用戶感覺所能使用的「內存」非常大, 但這是操作系統對物理內存的擴充。
它的物質基礎是:二級存儲器結構、和動態地址轉換(DAT)。
機構虛擬存儲器的基本特徵:
虛擬擴充。 虛擬存儲器不是物理上擴充內存空間, 而是邏輯上擴充了內存容量。
部分裝入。 每個作業不是全部一次的裝入內存, 而是分成若幹部分。
離散分配。 一個作業分成多個部分,沒有全部裝入內存。 即使裝入內存的那些部分也不必佔用連續的內存空間, 而是「見縫插針」。
多次對換。 在一個進程運行期間, 它所需的全部程序和數就要分成多次調入內存。
注意: 虛擬存儲器的容量雖然提供了特大的地址空間, 用戶在編程時一般不應考慮可用空間有多大。 但是, 虛擬存儲器的容量不是無限大的。 它主要受兩方面的限制:(1)機器指令中表示地址的二進制數是有限的;(2)外存的容量也是有限的。
更多:
http://www.fjtu.com.cn/fjnu/courseware/0333/course/_source/web/lesson/char2/j4.htm
E. 誰能告訴我虛擬內存的原理
引言
Windows的內存結構是深入理解Windows操作系統如何運作的最關鍵之所在,通過對內存結構的認識可清楚地了解諸如進程間數據的共享、對內存進行有效的管理等問題,從而能夠在程序設計時使程序以更加有效的方式運行。Windows操作系統對內存的管理可採取多種不同的方式,其中虛擬內存的管理方式可用來管理大型的對象和結構數組。
在Windows系統中,任何一個進程都被賦予其自己的虛擬地址空間,該虛擬地址空間覆蓋了一個相當大的范圍,對於32位進程,其地址空間為232=4,294,967,296 Byte,這使得一個指針可以使用從0x00000000到0xFFFFFFFF的4GB范圍之內的任何一個值。雖然每一個32位進程可使用4GB的地址空間,但並不意味著每一個進程實際擁有4GB的物理地址空間,該地址空間僅僅是一個虛擬地址空間,此虛擬地址空間只是內存地址的一個范圍。進程實際可以得到的物理內存要遠小於其虛擬地址空間。進程的虛擬地址空間是為每個進程所私有的,在進程內運行的線程對內存空間的訪問都被限制在調用進程之內,而不能訪問屬於其他進程的內存空間。這樣,在不同的進程中可以使用相同地址的指針來指向屬於各自調用進程的內容而不會由此引起混亂。下面分別對虛擬內存的各具體技術進行介紹。
地址空間中區域的保留與釋放
在進程創建之初並被賦予地址空間時,其虛擬地址空間尚未分配,處於空閑狀態。這時地址空間內的內存是不能使用的,必須首先通過VirtualAlloc()函數來分配其內的各個區域,對其進行保留。VirtualAlloc()函數原型為:
LPVOID VirtualAlloc(
LPVOID lpAddress,
DWORD dwSize,
DWORD flAllocationType,
DWORD flProtect
);
其參數lpAddress包含一個內存地址,用於定義待分配區域的首地址。通常可將此參數設置為NULL,由系統通過搜索地址空間來決定滿足條件的未保留地址空間。這時系統可從地址空間的任意位置處開始保留一個區域,而且還可以通過向參數flAllocationType設置MEM_TOP_DOWN標志來指明在盡可能高的地址上分配內存。如果不希望由系統自動完成對內存區域的分配而為lpAddress設定了內存地址(必須確保其始終位於進程的用戶模式分區中,否則將會導致分配的失敗),那麼系統將在進行分配之前首先檢查在該內存地址上是否存在足夠大的未保留空間,如果存在一個足夠大的空閑區域,那麼系統將會保留此區域並返回此保留區域的虛擬地址,否則將導致分配的失敗而返回NULL。這里需要特別指出的是,在指定lpAddress的內存地址時,必須確保是從一個分配粒度的邊界處開始。
一般來說,在不同的CPU平台下分配粒度各不相同,但目前所有Windows環境下的CPU如x86、32位Alpha、64位Alpha以及IA-64等均是採用64KB的分配粒度。如果保留區域的起始地址沒有遵循從64KB分配粒度的邊界開始之一原則,系統將自動調整該地址到最接近的64K的倍數。例如,如果指定的lpAddress為0x00781022,那麼此保留區域實際是從0x00780000開始分配的。參數dwSize指定了保留區域的大小。但是系統實際保留的區域大小必須是CPU頁面大小的整數倍,如果指定的dwSize並非CPU頁面的整數倍,系統將自動對其進行調整,使其達到與之最接近的頁面大小整數倍。與分配粒度一樣,對於不同的CPU平台其頁面大小也是不一樣的。在x86平台下,頁面大小為4KB,在32位Alpah平台下,頁面大小為8KB。在使用時可以通過GetSystemInfo()來決定當前主機的頁面大小。參數flAllocationType和flProtect分別定義了分配類型和訪問保護屬性。由於VirtualAlloc()可用來保留一個區域也可以用來佔用物理存儲器,因此通過flAllocationType來指定當前要保留的是一個區域還是要佔用物理存儲器是意義的。其可能使用的內存分配類型有:
分配類型 類型說明
MEM_COMMIT 為特定的頁面區域分配內存中或磁碟的頁面文件中的物理存儲
MEM_PHYSICAL 分配物理內存(僅用於地址窗口擴展內存)
MEM_RESERVE 保留進程的虛擬地址空間,而不分配任何物理存儲。保留頁面可通過繼續調用VirtualAlloc()而被佔用
MEM_RESET 指明在內存中由參數lpAddress和dwSize指定的數據無效
MEM_TOP_DOWN 在盡可能高的地址上分配內存(Windows 98忽略此標志)
MEM_WRITE_WATCH 必須與MEM_RESERVE一起指定,使系統跟蹤那些被寫入分配區域的頁面(僅針對Windows 98)
分配成功完成後,即在進程的虛擬地址空間中保留了一個區域,可以對此區域中的內存進行保護許可權許可范圍內的訪問。當不再需要訪問此地址空間區域時,應釋放此區域。由VirtualFree()負責完成。其函數原型為:
BOOL VirtualFree(
LPVOID lpAddress,
DWORD dwSize,
DWORD dwFreeType
);
其中,參數lpAddress為指向待釋放頁面區域的指針。如果參數dwFreeType指定了MEM_RELEASE,則lpAddress必須為頁面區域被保留時由VirtualAlloc()所返回的基地址。參數dwSize指定了要釋放的地址空間區域的大小,如果參數dwFreeType指定了MEM_RELEASE標志,則將dwSize設置為0,由系統計算在特定內存地址上的待釋放區域的大小。參數dwFreeType為所執行的釋放操作的類型,其可能的取值為MEM_RELEASE和MEM_DECOMMIT,其中MEM_RELEASE標志指明要釋放指定的保留頁面區域,MEM_DECOMMIT標志則對指定的佔用頁面區域進行佔用的解除。如果VirtualFree()成功執行完成,將回收全部范圍的已分配頁面,此後如再對這些已釋放頁面區域內存的訪問將引發內存訪問異常。釋放後的頁面區域可供系統繼續分配使用。
下面這段代碼演示了由系統在進程的用戶模式分區內保留一個64KB大小的區域,並將其釋放的過程:
// 在地址空間中保留一個區域
LPBYTE bBuffer = (LPBYTE)VirtualAlloc(NULL, 65536, MEM_RESERVE, PAGE_READWRITE);
……
// 釋放已保留的區域
VirtualFree(bBuffer, 0, MEM_RELEASE);
物理存儲器的提交與回收
在地址空間中保留一個區域後,並不能直接對其進行使用,必須在把物理存儲器提交給該區域後,才可以訪問區域中的內存地址。在提交過程中,物理存儲器是按頁面邊界和頁面大小的塊來進行提交的。若要為一個已保留的地址空間區域提交物理存儲器,需要再次調用VirtualAlloc()函數,所不同的是在執行物理存儲器的提交過程中需要指定flAllocationType參數為MEM_COMMIT標志,使用的保護屬性與保留區域時所用保護屬性一致。在提交時,可以將物理存儲器提交給整個保留區域,也可以進行部分提交,由VirtualAlloc()函數的lpAddress參數和dwSize參數指明要將物理存儲器提交到何處以及要提交多少物理存儲器。
與保留區域的釋放類似,當不再需要訪問保留區域中被提交的物理存儲器時,提交的物理存儲器應得到及時的釋放。該回收過程與保留區域的釋放一樣也是通過VirtualFree()函數來完成的。在調用時為VirtualFree()的dwFreeType參數指定MEM_DECOMMIT標志,並在參數lpAddress和dwSize中傳遞用來標識要解除的第一個頁面的內存地址和要釋放的位元組數。此回收過程同樣也是以頁面為單位來進行的,將回收設定范圍所涉及到的所有頁面。下面這段代碼演示了對先前保留區域的提交過程,並在使用完畢後將其回收:
// 在地址空間中保留一個區域
LPBYTE bBuffer = (LPBYTE)VirtualAlloc(NULL, 65536, MEM_RESERVE, PAGE_READWRITE);
// 提交物理存儲器
VirtualAlloc(bBuffer, 65536, MEM_COMMIT, PAGE_READWRITE);
……
// 回收提交的物理存儲器
VirtualFree(bBuffer, 65536, MEM_DECOMMIT);
// 釋放已保留的區域
VirtualFree(bBuffer, 0, MEM_RELEASE);
由於未經提交的保留區域實際是無法使用的,因此在編程過程中允許通過一次VirtualAlloc()調用而完成對地址空間的區域保留及對保留區域的物理存儲器的提交。相應的,回收、釋放過程也可由一次VirtualFree()調用來實現。上述代碼可按此方法改寫為:
// 在地址空間中保留一個區域並提交物理存儲器
LPBYTE bBuffer = (LPBYTE)VirtualAlloc(NULL, 65536, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
……
// 釋放已保留的區域並回收提交的物理存儲器
VirtualFree(bBuffer, 0, MEM_RELEASE | MEM_DECOMMIT);
頁文件的使用
在前面曾多次提到物理存儲器,這里所說的物理存儲器並不局限於計算機內存,還包括在磁碟空間上創建的頁文件,其存儲空間大小為計算機內存和頁文件存儲容量之和。由於通常情況下磁碟存儲空間要遠大於內存的存儲空間,因此頁文件的使用對於應用程序而言相當於透明的增加了其所能使用的內存容量。在使用時,由操作系統和CPU負責對頁文件進行維護和協調。只有在應用程序需要時才臨時將頁文件中的數據載入到內存供應用程序訪問之用,在使用完畢後再從內存交換回頁文件。
進程中的線程在訪問位於已提交物理存儲器的保留區域的內存地址時,如果此地址指向的數據當前已存在於內存,CPU將直接將進程的虛擬地址映射為物理地址,並完成對數據的訪問;如果此數據是存在於頁文件中的,就要試圖將此數據從頁文件載入到內存。在進行此處理時,首先要檢查內存中是否有可供使用的空閑頁面,如果有就可以直接將數據載入到內存中的空閑頁面,否則就要從內存中尋找一個暫不使用的可釋放的頁面並將數據載入到此頁面。如果被釋放頁面中的數據仍為有效數據(即以後還會用到),就要先將此頁面從內存寫入到頁文件。在數據載入到內存後,仍要在CPU將虛擬地址映射為物理地址後方可實現對數據的訪問。與對物理存儲器中數據的訪問有所不同,在運行可執行程序時並不進行程序代碼和數據的從磁碟文件到頁文件的復制過程,而是在確定了程序的代碼及其數據的大小後,由系統直接將可執行程序的映像用作程序的保留地址空間區域。這樣的處理方式大大縮短了程序的啟動時間,並可減小頁文件的尺寸。
對內存的管理
使用虛擬內存技術將能夠對內存進行管理。對當前內存狀態的動態信息可通過GlobalMemoryStatus()函數來獲取。GlobalMemoryStatus()的函數原型為:
VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
其參數lpBuffer為一個指向內存狀態結構MEMORYSTATUS的指針,而且要預先對該結構對象的數據成員進行初始化。MEMORYSTATUS結構定義如下:
typedef struct _MEMORYSTATUS {
DWORD dwLength; // MEMORYSTATUS結構大小
DWORD dwMemoryLoad; // 已使用內存所佔的百分比
DWORD dwTotalPhys; // 物理存儲器的總位元組數
DWORD dwAvailPhys; // 空閑物理存儲器的位元組數
DWORD dwTotalPageFile; // 頁文件包含的最大位元組數
DWORD dwAvailPageFile; // 頁文件可用位元組數
DWORD dwTotalVirtual; // 用戶模式分區大小
DWORD dwAvailVirtual; // 用戶模式分區中空閑內存大小
} MEMORYSTATUS, *LPMEMORYSTATUS;
下面這段代碼通過設置一個定時器而每隔5秒更新一次當前系統對內存的使用情況:
// 設置定時器
SetTimer(0, 5000, NULL);
……
void CSample22Dlg::OnTimer(UINT nIDEvent)
{
// 獲取當前內存使用狀態
MEMORYSTATUS mst;
GlobalMemoryStatus(&mst);
// 已使用內存所佔的百分比
m_dwMemoryLoad = mst.dwMemoryLoad;
// 物理存儲器的總位元組數
m_dwAvailPhys = mst.dwAvailPhys / 1024;
// 空閑物理存儲器的位元組數
m_dwAvailPageFile = mst.dwAvailPageFile / 1024;
// 頁文件包含的最大位元組數
m_dwAvailVirtual = mst.dwAvailVirtual / 1024;
// 頁文件可用位元組數
m_dwTotalPageFile = mst.dwTotalPageFile / 1024;
// 用戶模式分區大小
m_dwTotalPhys = mst.dwTotalPhys / 1024;
// 用戶模式分區中空閑內存大小
m_dwTotalVirtual = mst.dwTotalVirtual / 1024;
// 更新顯示
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
對內存的管理除了對當前內存的使用狀態信息進行獲取外,還經常需要獲取有關進程的虛擬地址空間的狀態信息。可由VirtualQuery()函數來進行查詢,其原型聲明如下:
DWORD VirtualQuery(
LPCVOID lpAddress, // 內存地址
PMEMORY_BASIC_INFORMATION lpBuffer, // 指向內存信息結構的指針
DWORD dwLength // 內存的大小
);
其中lpAddress參數為要查詢的虛擬內存地址,該值將被調整到最近的頁邊界處。當前計算機的頁面大小可通過GetSystemInfo()函數獲取,該函數需要一個指向SYSTEM_INFO結構的指針作為參數,獲取到的系統信息將填充在該數據結構對象中。下面這段代碼通過對GetSystemInfo()的調用而獲取了當前的系統信息:
// 得到當前系統信息
GetSystemInfo(&m_sin);
// 位屏蔽,指明哪個CPU是活動的
m_dwActiveProcessorMask = m_sin.dwActiveProcessorMask;
// 保留的地址空間區域的分配粒度
m_dwAllocationGranularity = m_sin.dwAllocationGranularity;
// 進程的可用地址空間的最小內存地址
m_dwMaxApplicationAddress = (DWORD)m_sin.lpMaximumApplicationAddress;
// 進程的可用地址空間的最大內存地址
m_dwMinApplicationAddress = (DWORD)m_sin.lpMinimumApplicationAddress;
// 計算機中CPU的數目
m_dwNumberOfProcessors = m_sin.dwNumberOfProcessors;
// 頁面大小
m_dwPageSize = m_sin.dwPageSize;
// 處理器類型
m_dwProcessorType = m_sin.dwProcessorType;
//進一步細分處理器級別
m_wProcessorLevel = m_sin.wProcessorLevel;
// 系統處理器的結構
m_wProcessorArchitecture = m_sin.wProcessorArchitecture;
// 更新顯示
UpdateData(FALSE);
VirtualQuery()的第二個參數lpBuffer為一個指向MEMORY_BASIC_INFORMATION結構的指針。VirtualQuery()如成功執行,該結構對象中將保存查詢到的虛擬地址空間狀態信息。MEMORY_BASIC_INFORMATION結構的定義為:
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress; // 保留區域的基地址
PVOID AllocationBase; // 分配的基地址
DWORD AllocationProtect; // 初次保留時所設置的保護屬性
DWORD RegionSize; // 區域大小
DWORD State; // 狀態(提交、保留或空閑)
DWORD Protect; // 當前訪問保護屬性
DWORD Type; // 頁面類型
} MEMORY_BASIC_INFORMATION;
通過VirtualQuery()函數對由lpAddress和dwLength參數指定的虛擬地址空間區域的查詢而獲取得到的相關狀態信息:
// 更新顯示
UpdateData(TRUE);
// 虛擬地址空間狀態結構
MEMORY_BASIC_INFORMATION mbi;
// 查詢指定虛擬地址空間的狀態信息
VirtualQuery((LPCVOID)m_dwAddress, &mbi, 1024);
// 保留區域的基地址
m_dwBaseAddress = (DWORD)mbi.BaseAddress;
// 分配的基地址
m_dwAllocateBase = (DWORD)mbi.AllocationBase;
// 初次保留時所設置的保護屬性
m_dwAllocateProtect = mbi.AllocationProtect;
// 區域大小
m_dwRegionSize = mbi.RegionSize;
// 狀態(提交、保留或空閑)
m_dwState = mbi.State;
// 當前訪問保護屬性
m_dwProtect = mbi.Protect;
// 頁面類型
m_dwType = mbi.Type;
// 更新顯示
UpdateData(FALSE);
小結
本文主要對內存管理中的虛擬內存技術的基本原理、使用方法和對內存的管理等進行了介紹。通過本文將能夠掌握虛擬內存的一般使用方法,與之相關的內存管理技術還包括內存文件映射和堆管理等技術,讀者可參閱相關文章。這幾種內存管理技術同屬Windows編程中的高級技術,在應用程序中適當使用將有助於程序性能的提高。本文所述程序在Windows 2000 Professional下由Microsoft Viusual C++ 6.0編譯通過。
F. 電子計算機中的虛擬內存器的作用是什麼
一般來說,任何一個程序都要調入內存才能執行。為了能夠運行更大的程序,為了同時運行多道程序,就需要配置較大的內存,或對已有的機器擴大內存。隨著存儲器晶元集成度的不斷提高和價格的下降,今天PC機的內存容量不但超過了前些年大型機的內存容量,而且還超過了一些小型機的外存容量。例如,當前PC機的內存配置已在百兆數量級上。當然,內存的擴充總歸有限,有沒有可能讓較小的內存運行更大的程序呢?目前廣泛採用的「虛擬存儲技術」可以通過軟體方法,將主存和一部分外存空間構成一個整體,為用戶提供一個比實際物理存儲器大得多的存儲器,這稱之為「虛擬存儲器」。
虛擬存儲器的原理同樣是基於這樣一個現實:即程序的運行在一段時間內不會涉及它的全部指令,而僅僅是局限在一段程序代碼之內。當一個程序需要執行時,只要將其調入虛擬存儲器就可以了,而不必全部調入內存。程序進人虛擬存儲器後,就完全由操作系統進行管理和調度。系統會根據一定的演算法,將實際執行到的那段程序代碼調入物理內存(稱為頁進)。若內存已滿,系統會將目前暫不執行的代碼送回到作為虛擬存儲器的外存區域(稱為頁出),
再將當前要執行的代碼調入內存。這樣,操作系統會通過頁進、頁出,保證要執行的程序段都在內存。而一次頁進就可以解決若干條指令的執行。
虛擬存儲器技術有效地解決了物理存儲器不足的問題。但是,程序執行過程中的頁進、頁出實際上是內外存的交換,而訪問外存的時間比訪問內存要慢得多。也就是說,從用戶的使用角度講,虛擬存儲器如同物理存儲器的作用,但比物理存儲器要慢一些。虛擬存儲器技術實際上是用時間換取了空間。
G. 什麼是虛擬內存原理
內存在計算機中的作用很大,電腦中所有運行的程序都需要經過內存來執行,如果執行的程序很大或很多,就會導致內存消耗殆盡。為了解決這個問題,Windows中運用了虛擬內存技術,即拿出一部分硬碟空間來充當內存使用,當內存佔用完時,電腦就會自動調用硬碟來充當內存,以緩解內存的緊張。舉一個例子來說,如果電腦只有128MB物理內存的話,當讀取一個容量為200MB的文件時,就必須要用到比較大的虛擬內存,文件被內存讀取之後就會先儲存到虛擬內存,等待內存把文件全部儲存到虛擬內存之後,跟著就會把虛擬內里儲存的文件釋放到原來的安裝目錄里了。
當系統運行時,先要將所需的指令和數據從外部存儲器(如硬碟、軟盤、光碟等)調入內存中,CPU再從內存中讀取指令或數據進行運算,並將運算結果存入內存中,內存所起的作用就像一個「二傳手」的作用。當運行一個程序需要大量數據、佔用大量內存時,內存這個倉庫就會被「塞滿」,而在這個「倉庫」中總有一部分暫時不用的數據占據著有限的空間,所以要將這部分「惰性」的數據「請」出去,以騰出地方給「活性」數據使用。這時就需要新建另一個後備「倉庫」去存放「惰性」數據。由於硬碟的空間很大,所以微軟Windows操作系統就將後備「倉庫」的地址選在硬碟上,這個後備「倉庫」就是虛擬內存。在默認情況下,虛擬內存是以名為Pagefile.sys的交換文件保存在硬碟的系統分區中。
H. 虛擬存儲器技術主要用於解決什麼問題簡述虛擬存儲器的基本工作原理。
虛擬存儲器技術主要解決電腦內存不夠的問題,電腦中所運行的程序均需經由內存執行,若執行的程序佔用內存很大或很多,則會導致內存消耗殆盡。
為解決該問題,Windows中運用了虛擬內存技術,即勻出一部分硬碟空間來充當內存使用。當內存耗盡時,電腦就會自動調用硬碟來充當內存,以緩解內存的緊張。若計算機運行程序或操作所需的隨機存儲器(RAM)不足時,則 Windows 會用虛擬存儲器進行補償。
工作原理
1、中央處理器訪問主存的邏輯地址分解成組號a和組內地址b,並對組號a進行地址變換,即將邏輯組號a作為索引,查地址變換表,以確定該組信息是否存放在主存內。
2、如該組號已在主存內,則轉而執行④;如果該組號不在主存內,則檢查主存中是否有空閑區,如果沒有,便將某個暫時不用的組調出送往輔存,以便將這組信息調入主存。
3、從輔存讀出所要的組,並送到主存空閑區,然後將那個空閑的物理組號a和邏輯組號a登錄在地址變換表中。
4、從地址變換表讀出與邏輯組號a對應的物理組號a。
5、從物理組號a和組內位元組地址b得到物理地址。
6、根據物理地址從主存中存取必要的信息。
(8)操作系統虛擬存儲器的原理擴展閱讀:
相關概念
1、實地址與虛地址
用戶編製程序時使用的地址稱為虛地址或邏輯地址,其對應的存儲空間稱為虛存空間或邏輯地址空間;而計算機物理內存的訪問地址則稱為實地址或物理地址,其對應的存儲空間稱為物理存儲空間或主存空間。程序進行虛地址到實地址轉換的過程稱為程序的再定位。
2、虛擬內存的訪問過程
虛存空間的用戶程序按照虛地址編程並存放在輔存中。程序運行時,由地址變換機構依據當時分配給該程序的實地址空間把程序的一部分調入實存。
每次訪存時,首先判斷該虛地址所對應的部分是否在實存中:如果是,則進行地址轉換並用實地址訪問主存;否則,按照某種演算法將輔存中的部分程序調度進內存,再按同樣的方法訪問主存。
3、異構體系
從虛存的概念可以看出,主存-輔存的訪問機制與cache-主存的訪問機制是類似的。這是由cache存儲器、主存和輔存構成的三級存儲體系中的兩個層次。cache和主存之間以及主存和輔存之間分別有輔助硬體和輔助軟硬體負責地址變換與管理,以便各級存儲器能夠組成有機的三級存儲體系。
I. 虛擬存儲器的基本原理是什麼其容量主要受到什麼限制
虛擬存儲器的基本特徵是:
①虛擬擴充,即不是物理上而是邏輯上擴充了內存容量;
②部分裝入,即每個作業不是全部一次性地裝入內存,而是只裝入一部分;
③離散分配,即不必佔用連續的內存空間,而是"見縫插針";
④多次對換,即所需的全部程序和數據要分成多次調入內存.
虛擬存儲器的容量主要受到指令中表示地址的字長和外存的容量的限制.
J. 什麼是虛擬存儲器它的原理是是什麼
虛擬內存別稱虛擬存儲器(Virtual Memory),是計算機系統內存管理的一種技術。它使得應用程序認為它擁有連續的可用的內存(一個連續完整的地址空間)。
工作原理:
虛擬存儲器是由硬體和操作系統自動實現存儲信息調度和管理的。它的工作過程包括6個步驟:[3]
①中央處理器訪問主存的邏輯地址分解成組號a和組內地址b,並對組號a進行地址變換,即將邏輯組號a作為索引,查地址變換表,以確定該組信息是否存放在主存內。
②如該組號已在主存內,則轉而執行;如果該組號不在主存內,則檢查主存中是否有空閑區,如果沒有,便將某個暫時不用的組調出送往輔存,以便將這組信息調入主存。
③從輔存讀出所要的組,並送到主存空閑區,然後將那個空閑的物理組號a和邏輯組號a登錄在地址變換表中。
④從地址變換表讀出與邏輯組號a對應的物理組號a。
⑤從物理組號a和組內位元組地址b得到物理地址。
⑥根據物理地址從主存中存取必要的信息。
(10)操作系統虛擬存儲器的原理擴展閱讀:
虛擬內存不只是「用磁碟空間來擴展物理內存」的意思——這只是擴充內存級別以使其包含硬碟驅動器而已。把內存擴展到磁碟只是使用虛擬內存技術的一個結果,它的作用也可以通過覆蓋或者把處於不活動狀態的程序以及它們的數據全部交換到磁碟上等方式來實現。
對虛擬內存的定義是基於對地址空間的重定義的,即把地址空間定義為「連續的虛擬內存地址」,以藉此「欺騙」程序,使它們以為自己正在使用一大塊的「連續」地址。
現代所有用於一般應用的操作系統都對普通的應用程序使用虛擬內存技術,例如文字處理軟體,電子製表軟體,多媒體播放器等等。
老一些的操作系統,如DOS和1980年代的Windows,或者那些1960年代的大型機,一般都沒有虛擬內存的功能——但是Atlas,B5000和蘋果公司的Lisa都是很值得注意的例外。
那些需要快速訪問或者反應時間非常一致的嵌入式系統,和其他的具有特殊應用的計算機系統,可能會為了避免讓運算結果的可預測性降低,而選擇不使用虛擬內存。