深入sql server 2000的內存管理機制
 
 
http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnsqldev/html/sqldev_01262004.asp
 
ken henderson
microsoft corporation
備注:ken henderson 從開發者的角度來闡述了sql server 2000內存管理的內部機制
 
簡介
在本專欄中,我們將從一個開發者的角度來探索sql server 的內存管理。因此我們將討論服務器內存管理的api和操作系統的內存管理機制,他們是如何運行的? 以這種新穎的方式來探討sql server內存管理,可以使開發人員明白其中的前因后果,精通一個產品,我們要了解它內部是如何運行和特定的用途。
我們首先開始的研究,它包括一些windows內存管理的基本原理。和所有的32位的windows程序一樣,sql server也是使用windows的內存管理機制來分配、釋放和通用的內存管理資源。也就是說,sqlserver和其他windows程序一樣通過win32 api函數和操作系統提供的內存管理資源交互。
     因為幾乎所有的sqlserver內存分配都是使用虛擬內存(而不是堆的方式),大部分的內存分配的代碼分解到最后都是調有win32的virtualallo 和virtualfree api函數。sql server通過調用virtualallo函數來預留和提交虛擬內存,通過virtualfree函數來釋放內存。
 
虛擬內存和物理內存
在x86處理器的系列中,windows提供所有的程序可以尋址4gb虛擬內存空間。所謂“虛擬”的意思是,這并不是傳統意義上的內存,它僅僅是一段沒有物理存儲的隱式地址段。因為只有一個程序開始內存分配,才開始使用這些地址段和物理的分配存儲空間。而且,這些物理的存儲空間并不需要物理的內存(不完全),通常是磁盤空間。明確的說應該是在系統的虛擬頁文件中。這就是為什么有許多程序(每個程序有4gb的虛擬內存空間)可以同時運行在只有128m的物理內存的機器上,就像每個程序自己分配真實的內存一樣。windows透明地控制從系統頁文件拷貝和讀取數據,因此程序可以在運行的機器上分配比物理內存更多的內存空間并且各種程序可以均等的訪問該機器物理內存。
4gb的內存地址空間分為2塊:用戶內存空間和核心內存空間。默認每個容量為2g,你可以通過windows nt 系列操作系統的boot.ini文件來改變默認空間的大?。ū热纾簑indows nt,windows 2000,windows xp 和windows server 2003都是windows nt 系列的產品,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.
 
盡管每一個程序接受自己的虛擬內存空間,系統代碼和設備驅動代碼共享一個單獨私有的虛擬地址空間。每個虛擬內存頁都和一種特殊處理器模式關聯。為了滿足所有的系統頁都可以被訪問,處理器必須是請求模式。這個意思是說用戶的程序是無法直接訪問核心內存空間,系統必須切換為核心模式,這樣核心模式的內存空間才可以被訪問。
 
程序內存空間調整
在boot.ini文件中有一個/3gb的參數可以允許改變默認的限制(這個參數在windows advanced server和 windows 2000 data center有效),這樣可以通過犧牲核心內存空間(從2g降低到1g)將用戶應用程序的內存空間從2g增加到3g.在windows的用法中,這種機制叫程序內存空間調整或叫4gt調整(4gt).你可以通過在boot.ini文件的[operating systems]區域的適當的行加/3gb參數來調整應用程序的內存空間.對一般的人來說可以選擇配置boot.ini文件的[operating systems]區域的適當的行增加/3gb或不加/3gb參數來啟動系統.
警告:你也可以在windows 2000 professional和windows 2000 的啟動文件中加/3gb的參數來啟動系統,可是這樣只是減少了核心內存空間到1gb但并沒有增加應用程序內存空間.換句話說,這樣做并沒有從降低核心內存空間獲得益處
注釋:在windowsxp和windows server 2003中提供一個新的啟動參數/userva,可以和/3gb參數一樣使用,但允許你有更加出色的控制度.你可以象/3gb 一樣將/userva參數到boot.ini文件中. /userva參數比/3gb的優勢在于,它可以允許你指定內存地址空間分配給應用程序的大小.比如: /userva=2500 的意思就是配置2.5g的內存地址空間預留給用戶內存空間,1.5g的留給核心內存空間.特別說明/3gb參數還是可以單獨使用的.
新聞熱點
疑難解答