深入SQL SERVER 2000的內(nèi)存管理機制
http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnsqldev/html/sqldev_01262004.asp
Ken Henderson
Microsoft Corporation
備注:Ken Henderson 從開發(fā)者的角度來闡述了SQL SERVER 2000內(nèi)存管理的內(nèi)部機制
簡介
在本專欄中,我們將從一個開發(fā)者的角度來探索SQL SERVER 的內(nèi)存管理。因此我們將討論服務器內(nèi)存管理的API和操作系統(tǒng)的內(nèi)存管理機制,他們是如何運行的? 以這種新穎的方式來探討SQL SERVER內(nèi)存管理,可以使開發(fā)人員明白其中的前因后果,精通一個產(chǎn)品,我們要了解它內(nèi)部是如何運行和特定的用途。
我們首先開始的研究,它包括一些Windows內(nèi)存管理的基本原理。和所有的32位的Windows程序一樣,SQL SERVER也是使用Windows的內(nèi)存管理機制來分配、釋放和通用的內(nèi)存管理資源。也就是說,SQLSERVER和其他Windows程序一樣通過WIN32 API函數(shù)和操作系統(tǒng)提供的內(nèi)存管理資源交互。
因為幾乎所有的SQLSERVER內(nèi)存分配都是使用虛擬內(nèi)存(而不是堆的方式),大部分的內(nèi)存分配的代碼分解到最后都是調(diào)有Win32的VirtualAllo 和VirtualFree API函數(shù)。SQL SERVER通過調(diào)用VirtualAllo函數(shù)來預留和提交虛擬內(nèi)存,通過VirtualFree函數(shù)來釋放內(nèi)存。
虛擬內(nèi)存和物理內(nèi)存
在X86處理器的系列中,Windows提供所有的程序可以尋址4GB虛擬內(nèi)存空間。所謂“虛擬”的意思是,這并不是傳統(tǒng)意義上的內(nèi)存,它僅僅是一段沒有物理存儲的隱式地址段。因為只有一個程序開始內(nèi)存分配,才開始使用這些地址段和物理的分配存儲空間。而且,這些物理的存儲空間并不需要物理的內(nèi)存(不完全),通常是磁盤空間。明確的說應該是在系統(tǒng)的虛擬頁文件中。這就是為什么有許多程序(每個程序有4GB的虛擬內(nèi)存空間)可以同時運行在只有128M的物理內(nèi)存的機器上,就像每個程序自己分配真實的內(nèi)存一樣。Windows透明地控制從系統(tǒng)頁文件拷貝和讀取數(shù)據(jù),因此程序可以在運行的機器上分配比物理內(nèi)存更多的內(nèi)存空間并且各種程序可以均等的訪問該機器物理內(nèi)存。
4GB的內(nèi)存地址空間分為2塊:用戶內(nèi)存空間和核心內(nèi)存空間。默認每個容量為2G,你可以通過Windows NT 系列操作系統(tǒng)的BOOT.INI文件來改變默認空間的大?。ū热纾?/span>Windows NT,Windows 2000,Windows XP 和Windows Server 2003都是Windows NT 系列的產(chǎn)品,Windows 9x 和 Windows ME不是的)。
Figure 1. Windows partitions a process‘s virtual address space into the user mode (application) and kernel mode (operating system) partitions.
盡管每一個程序接受自己的虛擬內(nèi)存空間,系統(tǒng)代碼和設備驅(qū)動代碼共享一個單獨私有的虛擬地址空間。每個虛擬內(nèi)存頁都和一種特殊處理器模式關(guān)聯(lián)。為了滿足所有的系統(tǒng)頁都可以被訪問,處理器必須是請求模式。這個意思是說用戶的程序是無法直接訪問核心內(nèi)存空間,系統(tǒng)必須切換為核心模式,這樣核心模式的內(nèi)存空間才可以被訪問。
程序內(nèi)存空間調(diào)整
在BOOT.INI文件中有一個/3GB的參數(shù)可以允許改變默認的限制(這個參數(shù)在Windows advanced server和 Windows 2000 Data Center有效),這樣可以通過犧牲核心內(nèi)存空間(從2G降低到1G)將用戶應用程序的內(nèi)存空間從2G增加到3G.在Windows的用法中,這種機制叫程序內(nèi)存空間調(diào)整或叫4GT調(diào)整(4GT).你可以通過在BOOT.INI文件的[operating systems]區(qū)域的適當?shù)男屑?/span>/3GB參數(shù)來調(diào)整應用程序的內(nèi)存空間.對一般的人來說可以選擇配置BOOT.INI文件的[operating systems]區(qū)域的適當?shù)男性黾?/span>/3GB或不加/3GB參數(shù)來啟動系統(tǒng).
警告:你也可以在Windows 2000 Professional和Windows 2000 的啟動文件中加/3GB的參數(shù)來啟動系統(tǒng),可是這樣只是減少了核心內(nèi)存空間到1GB但并沒有增加應用程序內(nèi)存空間.換句話說,這樣做并沒有從降低核心內(nèi)存空間獲得益處