操作系统真实的虚拟内存是什么样的
1. 內存及虛存基本布局
提起虛存,大都能說出幾條來。
對于32位系統,大多數操作系統都會將4GB的內存空間的一部分挪給內核使用,應用程序無法直接訪問這一段內存,這部分內存空間稱為內核空間。Windows默認情況下會將高地址的2GB分配給內核(也可配置為1GB),而Linux默認情況下將高地址的1GB空間分配給內核。參考閱讀:《程序員的自我修養—鏈接、裝載與庫》第10章--內存
Linux進程地址空間分布圖]:
windows進程地址空間分布圖如下圖所示:
2. Windows上的虛存概況
以windows平臺為例,應用程序可以調用堆API、.NET的垃圾回收器或者C運行時malloc相關API來分配虛擬內存,但是所有這些實現都依賴于VirtualAlloc API的實現。當應用用完地址空間的時候,接著會調用VirtualAlloc,然后可能會報錯(返回NULL地址). 使用TestLimit工具,http://download.sysinternals.com/files/TestLimit.zip, 該工具帶命令行參數-r 會不斷的調用VirtualAlloc,直至出錯。當在32位操作系統下運行時,會耗掉整個2GB的地址空間:
我們注意到2010MB并不等于2GB,但是Testlimit的其它代碼和數據,包括可執行碼和系統DLL,應該是是造成結果不同的原因,使用進程管理器,可能會看到實際虛存消耗:
有些應用,像SQL Server或者微軟的Active Directory,管理了大量的數據結構,如果加載到地址空間的數據越多,表現得會越好。因此,在Windows NT4 SP3 當中引入了boot啟動選項,/3GB,它允許將4GB的地址空間中的3GB提供給用戶態,也就是讓系統(內核)地址空間減少了1GB。Windows XP和win2003還引入了選項 /userva,來遷移2GB和3GB之間的內存碎片。詳見下圖:
如果要充分利用2G以上的空間,進程必須在exe文件中設定大地址標識。因為2GB空間的高位始終是0,這個高位同時也是用戶態自己的標識。如果超過了2G,高位將變成1,如果沒有相關處理,將會出錯。
所有的微軟服務器產品以及一些數據集中的程序都設定了大地址標識,如chkdsk.exe, lsass.exe (目錄服務會用到),Smss.exe(會話管理器進程), esentutl.exe(目錄Jet數據庫修復工具), 我們可以使用dumpbin工具來檢查exe中的該標志值, dumpbin是Visual Studio自帶的工具,如下圖所示:
Testlimit同樣也用上了大地址標識:
3. 64位環境下的虛存
64位windows下,地址空間遠遠不止4GB,? 這時,windows可以把32位進程序的最大的4GB全部用上,而剩余的地址空間都留給操作系統的虛存。如果您在64位的windows下運行Testlimit,可以看到它可以利用所有的32位地址空間:
64位進程序使用的是64位字長的指針,它們的理論最大地址空間為2^^64,然而windows并沒有為用戶進程序和操作系統提供比較平均的地址空間,而是在此空間中劃分了一部分區域給用戶進程,另一部分劃給不同的系統內存資源,如系統頁表的入口(PTE),文件緩存,頁緩沖池和非頁緩沖池。
IA64和x64體系下的進程地址空間大小是不同的,其大小取決于應用程序對內存用于支撐地址空間的總體需要(頁表中的頁和緩沖翻譯表 TLB)。對于x64體系(AMD),是8T的量,而IA64下,則是7168GB(7T)的量,中間有1T的差異,主要源于IA64下,有1TB的空間用于頂級頁目錄用于為系統的Wow64映射表保留。 IA64和x64版本的windows, 各種資源的地址空間,大概都是128GB (如非頁池,分配的就是的28GB的地址空間),只有一個例外,文件緩沖,它分配的是1TB的地址空間。總體來看,64位進程的地址空間,看起來如下圖所示:
可以明顯的看出,圖里邊有很大的地址空間空檔,可能會用于將來的地址擴展。當您運行64位版本的Testlimit,它會消耗8TB,那將是它能管理的地址空間范圍:
總結
以上是生活随笔為你收集整理的操作系统真实的虚拟内存是什么样的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wince对中文字体的支持
- 下一篇: 基于嵌入式操作系统VxWorks的多任务