從開發者視角深入剖析 SQL Server 2000 如何透過 Win32 API(VirtualAlloc/VirtualFree)管理虛擬記憶體,解釋 4GB 位址空間的 User/Kernel 模式分割、/3GB 啟動選項擴展使用者空間至 3GB、/USERVA 微調分割比例、以及 IMAGE_FILE_LARGE_ADDRESS_AWARE 標記對大位址感知的必要性。
核心概念
- 32 位元 Windows 給每進程 4GB 虛擬位址空間(非實體記憶體),分 User Mode(應用程式)與 Kernel Mode(核心),預設各 2GB。
- SQL Server 幾乎所有配置皆用虛擬記憶體,最終呼叫
VirtualAlloc/VirtualFree。
- /3GB(Win2000 Advanced Server 以上):User Mode 擴至 3GB,Kernel Mode 降為 1GB。需在
BOOT.INI 加入 /3GB 開關。
- /USERVA(XP/Server 2003):搭配 /3GB 使用,可精確指定 User Mode 大小(如
/USERVA=2560 給 2.5GB)。
- LARGE_ADDRESS_AWARE:PE 標頭第 32 位標記,告知 OS 該程式能正確處理高位址指標。SQL Server 已啟用此標記(可用 DumpBin/ImageCfg 驗證),故在正確 OS 上加 /3GB 即可受益。
警告
- 在 Win2000 Professional/Server(非 Advanced/DataCenter)加 /3GB 只會縮小 Kernel 空間,不會擴展 User 空間,反而有害。
- DLL 不檢查此標記,但 DLL 程式碼必須能正確處理高位址指標。