程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2000內存管理內幕

SQL Server 2000內存管理內幕

編輯:關於SqlServer

Introduction

在這篇專欄裡,我們將從開發者的角度來探討SQL Server內存管理內幕。就是說,我們將討論SQL Server使用API和操作系統功能管理內存的方式及其工作原理。通過這種方式探討一個產品,將有助於我們理解產品開發者的思路,以及他們所設計的使用方法。理解一個產品的工作原理和它的設計用途,是掌握這個產品的關鍵。

我們將從一些基礎的Windows內存管理基本原理介紹開始。和所有的32位Windows應用程序一樣,SQL Server使用Windows內存管理功能分配、釋放、管理內存資源。正如所有其它的Windows應用程序,SQL Server調用Win32內存管理API函數,與操作系統提供的內存資源進行交互。

由於SQL Server中幾乎所有的內存分配都使用虛擬內存(不是內存堆),因此絕大部分內存分配代碼最終都是通過調用Win32的VirtualAlloc或者是VirtualFree函數完成。SQL Server調用VirtualAlloc保留、提交分配的虛擬內存,調用VirtualFree釋放虛擬內存。

Virtual Memory vs Physical Memory

在x86系列處理器上,Windows為所有進程提供一個4GB虛擬內存工作空間。用"虛擬"這個詞,意思是這個內存並不是通常意義上的內存,它只是一個地址范圍,並沒有和物理存儲單元關聯在一起。當進程請求內存分配時,這些地址空間才被使用,和具體的物理存儲單元關聯起來。然而這些物理存儲單元並不一定是物理內存,它通常可能會是磁盤空間,確切的說,是操作系統的分頁文件(System Paging Files)。這就是為什麼多個應用程序可以同時運行在一個128M內存的系統上,每個應用程序都有一個4GB的虛擬內存地址空間--它不是真正的內存,但對應用程序來說可以理解為內存。Windows透明的處理paging files的數據拷貝,以使應用程序能夠使用的內存可以超過機器的實際物理內存,並使應用程序能夠公平的存取機器的物理內存。

這個4GB的地址空間被分成兩部分:user mode部分和kernal mode部分。默認情況下,每個部分的大小為2GB,在Windows NT系列的操作系統上,可以通過BOOT.INI中的開關來改變這個默認設置(Windows NT, Windows 2000, Windows XP和Windows Server 2003屬於Windows NT系列,Windows 9x和Windows ME不屬於)。

圖1:Windows將進程的虛擬地址空間分成user mode(應用程序)和kernal mode(操作系統)兩個部分

每個應用程序擁有自己的虛擬內存地址空間,但操作系統和設備驅動程序共享同一個私有地址空間。每一個虛擬內存頁(memory page)都和特定的處理器模式(processor mode)相關聯,為了存取某個虛擬內存頁,處理器必須工作在要求的模式下。這意味著應用程序不能直接存取kernal mode的虛擬內存,系統必須切換到kernal mode才能存取kernal mode的內存空間。

Application Memory Tuning

3GB啟動選項(Windows 2000的Advanced Server和DataCenter及後續Windows版本中可用)允許改變這兩個地址空間部分的默認大小。它允許將進程的user mode地址空間從2GB擴展到3GB,相應的代價是kernal mode的地址空間從2GB減小到1GB。用Windows的說法,這個功能叫做Application Memory Tuning或者是4GB Tuning(4GT)。你可以通過在BOOT.INI文件的[Operating Systems]部分添加/3GB開關啟用應用Application Memory Tuning。通常情況下,人們通過設置BOOT.INI文件的[Operating Systems]部分,將系統配置為可以使用3GB或者不使用3GB啟動,以使在系統啟動時可以進行選擇。

警告:你也可以在Windows 2000 Professional和Windows 2000 Server上使用/3GB開關,這樣做的負面結果是,將kernal mode的空間減小到了1GB,但並不會增加user mode的空間。換句話說,你減小了kernal mode的空間但並沒有獲得任何好處。

注意:Windows XP和Windows Server 2003引入了一個新的啟動選項/USERVA,和/3GB一起使用,比單獨使用/3GB能夠更好的控制。你在BOOT.INI中添加/3GB的時候可以同時添加/USERVA,/USERVA比單獨使用/3GB的優點是它允許你指定一個准確的地址空間大小值供user mode存取。例如,/USERVA=2560為user mdoe配置2.5G的空間,剩余的1.5G用於kernal mode。上面的警告信息在使用/USERVA選項時同樣適用。

Large-Address-Aware Executables

在/3GB支持加入Windows之前,應用程序無法使用指針的最高位,User mode的應用程序只能夠對32位指針的前31位表示的地址空間進行存取。對於剩下的1位,一些聰明的開發者不希望浪費進程空間裡的這1個位,把它用於了其它的目的,例如用於標識那些應用程序特定的地址分配類型的指針。這在引入/3GB後帶來一個難題,因為這種類型的應用程序無法區分引用2GB以上內存的指針,和那些引用2GB以下內存但是最高位由於其它原因而被設置的指針。基本上,使用/3GB啟動機器,會使這樣的應用程序崩潰。為了解決這個問題,微軟在Win32 PE文件格式(定義Windows下可執行文件Exe和Dll結構的格式)的Characteristics字段加入一個新標識位的支持,用於指示應用程序是否支持大的尋址能力。設置可執行文件頭中Characteristics字段的第32位啟用IMAGE_FILE_LARGE_ADDRESS_AWARE標識位。通過設置應用程序頭的這個標識位,表明應用程序能夠處理那些最高位被設置的指針,不會由於這個位帶來任何多意性。當設置了這個標識位,在正確的Windows版本上使用/3GB選項啟動,系統將為進程提供一個私有的擴展user mode地址空間。你可以使用DumpBin、ImageCfg等可以分析可執行文件頭的工具,查看應用程序是否啟用了這個標識位。Visual C++通過/LARGEADDRESSAWARE連接開關提供對IMAGE_FILE_LARGE_ADDRESS_AWARE的支持。SQL Server啟用了這個標識位,因此當你在正確的Windows版本上使用/3GB開關啟動,系統將擴展SQL Server的user mode地址空間。

注意:Windows在進程啟動時檢查IMAGE_FILE_LARGE_ADDRESS_AWARE標識,忽略Dll的標識。對那些最高位被設置的指針,dll代碼必須能夠正確處理。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved