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