国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

深入SQL SERVER 2000的內存管理機制(二)

2024-08-31 00:48:57
字體:
來源:轉載
供稿:網友

深入sql server 2000的內存管理機制(二)

 

 

http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnsqldev/html/sqldev_01262004.asp

 

可訪問大地址的應用 (large-address-aware executables)

在windows增加支持/3gb參數以前,一個應用程序是無法訪問一個帶有高位設置的指針.一個32位的指針只有前31位地址空間可以被用戶模式的應用程序訪問.這剩余的一位不用.因此有一些聰明的開發者因為其他的目的不愿意在處理內存地址空間時浪費這一位.(舉例來說:可以用來標志一個指針引用其它應用程序分配的數據類型).這樣就/3gb參數就遇到一個難題,因為這種類型的程序不能方便的區分一個合法的指針引用的內存空間在2g的分界線以上與一個內存地址空間在2g以下,但它的高位已經被用做它用的指針.基本上如果一臺機器用/3gb的參數啟動,這種應用程序是無法運行的.為解決這種狀況,微軟在win32的pe文件characteristics字段增加了一個新的標志位來表示一個程序是否運行在可訪問大地址的(large-address-aware executables)模式.當該標志位被起用( image_file_large_address_aware ),該可執行文件頭部characteristics字段的32位被置位.通過這個可執行文件頭部的標志位,應用程序可以暗示windows 它可以處理帶有高位設置的指針,這樣就不會帶來任何異常結果.當該標志被置位并且支持這種方式啟動的windows也是通過/3gb的參數啟動,這時操作系統會提供一直擴展的私有用戶模式的地址空間給應用程序.你可以通過工具,比如: dumpbin 和 imagecfg (轉儲可執行文件的頭部)來檢查一個可執行文件的該標志位.visual c++ 通過 /largeaddressaware 連接器開關來表示image_file_large_address_aware,sql servr已經將該標志位激活,所以你可以在支持/3gb參數的windows 版本中使用該參數,這樣操作系統回自動擴展sql server的用戶內存空間.

注釋:windows在可執行文件啟動時檢查image_file_large_address_aware 標志位,但忽略dll文件.dll代碼必須自動處理高位被置位的指針。

 

物理內存擴展

    intel 處理器自從pentium pro開始,以后的處理器都支持一種物理內存擴展(pae)的內存映射模式。pae模式提供了可以訪問64gb的物理內存空間。在pae模式中,內存管理單元(memory management unit (mmu))仍然執行:頁目錄入口page directory entries(pdes) 和頁表入口page table entries (ptes),但是在此之上有一個新的級別:頁目錄指針表。同時,在pae模式pdes 和ptes是64位的(不僅僅是標準的32位),這樣系統可以映射比標準轉換更多的內存空間,因為pdes 和ptes模式的尋址寬度是標準的2倍。這并不僅僅是增加了頁目錄指針表。頁目錄指針表被用來管理這些大容量表和索引。一些特殊版本的windows內核需要運行在pae模式。這中內核集成在windows 2000以及以后的版本中,在單處理器的機器中體現在ntkrnlpa.exe文件中,在多處理器的機器中體現在ntkrnlpamp.exe文件中。你可以向增加/3gb和/userva參數一樣在boot.ini文件中加/pae參數激活pae模式。

 

地址窗口擴展

windows的地址窗口擴展(awe)機制可以允許應用程序訪問超過4gb的物理內存。一個32位的指針是一個整數,只能保存0x00000000到0xffffffff的值,就是說可以引用4gb 以內線性的內存地址空間,awe允許一個應用程序繞過這些限制,通過操作系統訪問所有的內存空間。

從概念上說,awe并不是一個新的事物。在計算機發展之初,操作系統和應用程序已經使用相似的機制回避指針的限制。例如:我們倒退到dos年代,32位擴充功能被經常用來允許一個16位的程序訪問他自已以外的內存地址空間。一些特殊目的管理者和api經常使用擴充內存和擴展內存。你可能記得這樣一個很久以前產品quarterdeck qemm-386經常用來做這樣的事情。典型的機制是允許一個指針可以訪問超過本身限制的空間,(比如:地址太大無法在自己的指針中)通過在可以訪問的地址空間分配一個窗口或區域來和本身無法訪問的內存地址之間傳遞指針。awe的工作原理:你可以在可以訪問的地址空間提供一塊區域(窗口)作為分段傳輸區,來傳送在用戶內存空間無法訪問的內存地址。

為了使用awe,一個應用程序需要:

1.               分配的物理內存地址可以通過allocateuserphysicalpages  api函數訪問。這個函數需要調用者有lock pages in memory的權限。

2.               在可以訪問的內存空間建立一塊區域。通過virtualalloc api函數可以作為映射一個物理內存的映射窗口。

3.               通過mapuserphysicalpages 或mapuserphysicalpagesscatter win32 api 函數完成物理內存和虛擬內存的映射。

awe已經存在于所有的windows 2000和以后的操作系統中,甚至可以用于物理內存低于2gb的操作系統中,最典型的應用是在2gb或以上物理內存的機器上,因為這是一個32位處理器訪問3gb以下內存空間的唯一方法。如果你在一個低于3gb物理內存的sql server系統中激活awe支持,系統將忽略這個選項同時轉換為虛擬內存管理器代替。awe內存有一個有趣的特征就是從不和磁盤交換數據。你也許注意到特有的awe api程序引用可以訪問的內存空間是作為物理內存訪問。這點確切的說就是:awe內存是不和系統的虛擬頁面文件交互物理內存空間。

虛擬內存窗口被用來緩存awe讀寫訪問物理內存的請求。因此,當你配置這個窗口是page_readwrite唯一可以保護的特征就是轉嫁給了virtualalloc api函數。不要驚奇,這也意味你不能用virtualprotect api函數來保護這塊內存區域的修改和訪問。

注釋:還沒有專門的工具用來調查應用程序awe內存使用(任務管理器,性能監視器和監視系統 等等),顯示每一個程序awe內存的使用數量。這樣就沒有每個程序使用awe內存數量的軌跡,同時這些內存也沒包括在每個的程序的工作內存集中。

 

/3gb 和awe比較

     增加用戶程序地址空間的能力幾乎有50%的應用程序是通過內存調整,這是在windows內存管理機制當中非??旖莺褪軞g迎的手段。而且windows awe內存機制也是非常靈活和穩定的。就像我前面所說的,當你增加1g的用戶內存空間,這些內存是通過減少核心內存空間獲得的(從2g減到1g)。因為核心代碼的運行對整個內存空間來說是很狹窄的一塊即使用于2g的空間,收縮這些內存空間意味著內部核心架構也會收縮。其中最重要的是windows用來管理物理內存的表,當你收縮核心內存空間到1g,你就限制了這個表的大小,這樣只能管理最大16gb的物理內存。例如:如果你的應用程序運行在有64gb物理內存的server上并且你在啟動時加了/3gb的參數。你只能訪問整個內存的25%的空間—其余的48gb的內存空間無論時操作系統還是應用程序都無法訪問。awe可以允許你訪問比加/3gb參數更高的內存空間。顯然,你通過/3gb的參數只是增加了1gb的用戶內存空間,這些增加的內存空間只是對那些大地址自動獲得的應用程序有效,但是只有1gb。和/3gb參數對比,awe可以使整個的物理內存對操作系統有效和對使用awe win32 api的應用程序有效。因此,awe使用和操作起來更加復雜,也更加靈活和可擴展。

   著并不是說/3gb比awe更好是不存在的-不過這確實存在,比如:如果你需要分配更多的內存空間,但不能在awe中分配(線程堆棧,內存鎖,過程計劃),你也許發現/3gb回更好一些。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏东县| 二连浩特市| 绥芬河市| 象州县| 隆德县| 石城县| 徐州市| 上栗县| 蓝山县| 潜山县| 金山区| 彝良县| 宣恩县| 五台县| 固阳县| 巴塘县| 南京市| 祁门县| 扬州市| 海宁市| 梅河口市| 阿克陶县| 元氏县| 卓资县| 怀来县| 永顺县| 海南省| 枣阳市| 兖州市| 定安县| 清河县| 睢宁县| 包头市| 榆社县| 汶川县| 拉孜县| 武宣县| 乳源| 喜德县| 高州市| 日照市|