在這篇專欄里,我們將從開發(fā)者的角度來探討SQL Server內(nèi)存管理內(nèi)幕。 就是說,我們將討論SQL Server使用API和操作系統(tǒng)功能管理內(nèi)存的方式及其工作原理。通過這種方式探討一個產(chǎn)品,將有助于我們理解產(chǎn)品開發(fā)者的思路,以及他們設(shè)計的使用方法。 理解一個產(chǎn)品的工作原理和它的設(shè)計用途,是掌握這個產(chǎn)品的關(guān)鍵。 我們將從基礎(chǔ)的Windows內(nèi)存管理基本原理介紹開始。和所有32位Windows應(yīng)用程序一樣,SQL Server使用Windows內(nèi)存管理功能分配、釋放、管理內(nèi)存資源,它調(diào)用Win32內(nèi)存管理API函數(shù),與操作系統(tǒng)提供的內(nèi)存資源進(jìn)行交互。 由于SQL Server中幾乎所有的內(nèi)存分配都使用虛擬內(nèi)存(不是內(nèi)存堆),因此絕大部分內(nèi)存分配代碼最終都是通過調(diào)用Win32的VirtualAlloc或者是 VirtualFree函數(shù)完成。SQL Server調(diào)用VirtualAlloc預(yù)留、提交虛擬內(nèi)存,調(diào)用VirtualFree釋放虛擬內(nèi)存。
虛擬內(nèi)存與物理內(nèi)存 在x86系列處理器上,Windows為所有進(jìn)程提供一個4GB虛擬內(nèi)存工作空間。用"虛擬"這個詞,意思是這個內(nèi)存并不是通常意義上的內(nèi)存,它只是一個地址范圍,并沒有和物理存儲單元關(guān)聯(lián)在一起。當(dāng)進(jìn)程請求內(nèi)存分配時,這些地址空間才被使用,和具體的物理存儲單元關(guān)聯(lián)起來。然而這些物理存儲單元并不一定是物理內(nèi)存,它通常可能是磁盤空間,確切的說,是操作系統(tǒng)的分頁文件(System Paging Files)。 這就是為什么多個應(yīng)用程序可以同時運行在一個128M內(nèi)存的系統(tǒng)上,每個應(yīng)用程序都有一個4GB的虛擬內(nèi)存地址空間--它不是真正的內(nèi)存,但對應(yīng)用程序來說可以理解為內(nèi)存。Windows透明的處理分頁文件(paging files)的數(shù)據(jù)交換,使應(yīng)用程序能夠使用的內(nèi)存可以超過機(jī)器的實際物理內(nèi)存,并使應(yīng)用程序能夠公平的存取機(jī)器的物理內(nèi)存。 這個4GB的地址空間被分成兩部分:用戶模式(user mode)部分和內(nèi)核模式(kernal mode)部分。默認(rèn)情況下,每個部分的大小為2GB,在Windows NT系列的操作系統(tǒng)上,可以通過BOOT.INI中的開關(guān)來改變這個默認(rèn)設(shè)置(Windows NT, Windows 2000, Windows XP和Windows Server 2003屬于Windows NT系列,Windows 9x和Windows ME不屬于)。
|