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