資源描述:
《sql server 2000內(nèi)存管理內(nèi)幕--》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應用文檔-天天文庫。
1、SQLServer2000內(nèi)存管理內(nèi)幕>> Introduction 在這篇專欄里,我們將從開發(fā)者的角度來探討SQLServer內(nèi)存管理內(nèi)幕。就是說,我們將討論SQLServer使用API和操作系統(tǒng)功能管理內(nèi)存的方式及其工作原理。通過這種方式探討一個產(chǎn)品,將有助于我們理解產(chǎn)品開發(fā)者的思路,以及他們所設計的使用方法。理解一個產(chǎn)品的工作原理和它的設計用途,是掌握這個產(chǎn)品的關(guān)鍵?! ∥覀儗囊恍┗A(chǔ)的emory 在x86系列處理器上,內(nèi)存的系統(tǒng)上,每個應用程序都有一個4GB的虛擬內(nèi)存地址空間--它不是真正的內(nèi)存,但對應用程序來說可
2、以理解為內(nèi)存。emoryTuning 3GB啟動選項(emoryTuning。通常情況下,人們通過設置BOOT.INI文件的[OperatingSystems]部分,將系統(tǒng)配置為可以使用3GB或者不使用3GB啟動,以使在系統(tǒng)啟動時可以進行選擇?! 【妫耗阋部梢栽趏de的空間。換句話說,你減小了kernalmode的空間但并沒有獲得任何好處?! ∽⒁猓篸oe配置2.5G的空間,剩余的1.5G用于kernalmode。上面的警告信息在使用/USERVA選項時同樣適用。 Large-Address-Aode的應用程序只能夠?qū)?2位
3、指針的前31位表示的地址空間進行存取。對于剩下的1位,一些聰明的開發(fā)者不希望浪費進程空間里的這1個位,把它用于了其它的目的,例如用于標識那些應用程序特定的地址分配類型的指針。這在引入/3GB后帶來一個難題,因為這種類型的應用程序無法區(qū)分引用2GB以上內(nèi)存的指針,和那些引用2GB以下內(nèi)存但是最高位由于其它原因而被設置的指針。基本上,使用/3GB啟動機器,會使這樣的應用程序崩潰。為了解決這個問題,微軟在pBin、ImageCfg等可以分析可執(zhí)行文件頭的工具,查看應用程序是否啟用了這個標識位。VisualC++通過/LARG1234下一
4、頁>>>>這篇文章來自..,。EADDRESSAAGE_FILE_LARGE_ADDRESS_AemoryManagementUnit-MMU)仍然實現(xiàn)了頁目錄條目(PageDirectoryEntries-PDEs)和頁表條目(PageTableEntries-PTEs),但是在這個之上有一個新的層級:頁目錄指針表(PageDirectoryPointerTable)。PAE模式下系統(tǒng)能夠?qū)ぶ犯蟮膬?nèi)存,因為PDEs和PTEs為64位寬,是之前標準寬度的兩倍,而并不是通過PAE模式下的頁目錄指針表實現(xiàn)。頁目錄指針表把這些高存儲容
5、量的表和索引管理起來。使用PAE模式需要一個特殊版本的apUserPhysicalPages或者MapUserPhysicalPagesScatterAPI函數(shù),將需要存取的物理內(nèi)存映射到這個虛擬內(nèi)存窗口中?! n等,都無法顯示各個進程Aode的地址空間,kernalmode地址空間也由2GB被壓縮到1GB。對于kernalmode代碼,完整2GB的工作空間已經(jīng)顯得狹窄,壓縮這部分空間意味著某些內(nèi)部核心結(jié)構(gòu)也必須要壓縮。這些結(jié)構(gòu)中主要有機器上用于管理內(nèi)存的表窗口(tableWindoode部分壓縮到1GB后,這個表最大就只能管理
6、16GB的物理內(nèi)存了。例如你在一臺具有64GB物理內(nèi)存的機器上運行Windows2000DataCenter,啟動時使用了/3GB選項,你就只能夠存取這臺機器25%的內(nèi)存,剩余的48BG將無法被操作系統(tǒng)和應用程序使用。AWE允許你訪問超過3GB的內(nèi)存,而通過/3GB,你僅僅為私有進程空間獲得額外的1GB。LargeAddressAware自動透明的使得這個額外空間對應用程序可用,但它被限制在1GB之內(nèi)。理論上,AWE通過Win32AWEAPI函數(shù),使得所有對操作系統(tǒng)可用的物理內(nèi)存對應用程序可用。盡管AWE更難于使用和存取,但它更具
7、彈性和擴展?! 〔⒉皇钦f任何情況下AWE都比/3GB好,只是通常狀況下是這樣。比如說當你需要很多空間以分配內(nèi)存,而又不能放在AWE內(nèi)存中(例如象線程棧Th上一頁1234下一頁>>>>這篇文章來自..,。readStacks、鎖內(nèi)存LockMemory、存儲過程計劃ProcedurePlans等),你也許會發(fā)現(xiàn)/3GB更合適?! emoryRegions SQLServer將分配的內(nèi)存組織成兩個獨立的區(qū)域:BPool和MemToLeave。實際上如果你使用AemToLeave區(qū)域被保留,這有利于防止BPool隨后的預留造成內(nèi)存碎
8、片。接下來,BPool被保留,它可以分成多達32個獨立預留塊,用于滿足在BPool保留時SQLServer進程中那些正在請求虛擬地址空間的dll及其它分配請求。在保留BPool區(qū)域之后,MemToLeave區(qū)域被釋放。MemToLeave用于SQL