1. 程式人生 > >轉發: windows如何管理內存

轉發: windows如何管理內存

做的 大文件 相同 page 這一 進程 運行 數據區 概念

(1)有三種方法:虛擬內存,內存映射文件,內存堆棧。

虛擬內存是將頁文件加載到內存,適用於比較大的對象或結構;

內存映射文件是將磁盤上文件加載到內存,適用於大文件和單機的進程間內存共享;

堆棧就是動態的分配內存,適用於小對象的創建。

這些在windows核心編程中都描述得很詳細的。

(2)當進程要讀自己的虛擬地址空間中的數據時:

if(數據在物理內存中)
{
虛擬地址轉換成物理地址
讀數據
}
else
{
if(數據在磁盤中)
{
if(物理內存還有空閑)
{
把數據從磁盤中讀到物理內存
虛擬地址轉換成物理地址
讀數據
}
else
{
把物理內存中某頁的數據存入磁盤
把要讀的數據從磁盤讀到該頁的物理內存中
虛擬地址轉換成物理地址
讀數據
}
}
else
{
報錯
}
}

(3)當程序運行時需要從內存中讀出這段程序的代碼。

代碼的位置必須在物理內存中才能被運行,由於現在的操作系統中有非常多的程序運行著,內存中不能夠完全放下,所以引出了虛擬內存的概念。把哪些不常用的程序片斷就放入虛擬內存,當需要用到它的時候在load入主存(物理內存)中。這個就是內存管理所要做的事。內存管理還有另外一件事需要做:計算程序片段在主存中的物理位置,以便CPU調度。

內存管理有塊式管理,頁式管理,鍛式和鍛頁式管理。現在常用事鍛頁式管理 塊式管理:把主存分為一大塊、一大塊的,當所需的程序片斷不在主存時就分配一塊主存空間,把程 序片斷load入主存,就算所需的程序片度只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的內存空間,但時易於管理。

頁式管理:把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。

段式管理:把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個缺點。一個程序片斷可能會被分為幾十段,這樣很多時間就會被浪費在計算每一段的物理地址上(計算機最耗時間的大家都知道是I/O吧)。

鍛頁式管理:結合了段式管理和頁式管理的優點。把主存分為若幹頁,每一頁又分為若幹段。好處就很明顯,不用我多說了吧。

各種內存管理都有它自己的方法來計算出程序片斷在主存中的物理地址,其實都很相似。

虛擬內存:

1)對計算機而言,物理內存的大小即主板上插著的內存條的大小;對CPU而言,的物理內存的大小即CPU上地址線可尋址的大小。

2)虛擬內存即某個程序運行時所創建的數據區,它的大小可能大於物理內存,它是一種內存管理上的抽象。

3)由於虛擬內存很可能大於物理內存,所以操作系統使用一種內存分頁機制,將虛擬內存分成多個頁(page),將物理內存分成多個頁幀(page frame),頁和頁幀的大小相同。現使用的虛擬內存頁將會通過頁表(page table)映射到物理內存頁幀上,顯然實時映射的範圍最大只能是物理內存的大小範圍。如果現需使用的某個虛擬內存頁沒有處於這個映射當中,則操作系統使某個使用較少的頁幀失效,並將該頁幀的內容存入其他媒介當中(比如磁盤),然後在該頁幀的物理內存和需要空間的虛擬內存頁映射起來。

4)虛擬內存地址由頁號(與頁表中的頁號關聯)和偏移量組成。

轉發: windows如何管理內存