




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Windows內存原理與內存管理(2013-04-06 00:09:50) WIndows為每個進程分配了4GB的虛擬地址空間,讓每個進程都認為自己擁有4GB的內存空間,4GB怎么來的? 32位 CPU可以取地址的空間為2的32次方,就是4GB(正如16位CPU有20根尋址線所有擁有2的20次方的尋址空間一樣)當我們在Windows中雙擊一個應用程序圖標后,系統為該應用程序創建一個進程,Windows使得每個進程都擁有2GB的地址空間,這2GB地址空間用于程序存放代碼,數據,堆棧,自由存儲區(堆),另外2GB用于共享系統使用前面的這些地址并不是物理內存中的地址,而是該進程空間中的虛擬地址虛擬空
2、間只是Windows為該進程分配的一個虛擬的地址空間,只有當其和物理內存相關聯后才有意義內存的分頁每個物理地址對應一個虛擬地址?1GB那頁表該有多長,所以將內存分頁管理,4K為一頁,即4K就是一個最小單位。虛擬地址到物理地址的映射見圖,中間的那個就是頁表了。如何映射?進程被創建時會建立一個 虛擬內從到物理內存的映射表-頁表,根據頁表可以將虛擬內存和物理內存關聯起來 -頁表如何工作,怎么將虛擬地址關聯物理地址-虛擬內存是什么?就是把磁盤拿來當內存用,這是以前買電腦時的想法。所以就一直都想不明白一個問題:要真是這樣,那內存分個什么1GB,2GB,4GB,大家都買個1M的內存條,然后把自己磁盤拿來當
3、內存用多好,比2GB,4GB不知道要大多少。其實這個說法有一點擦邊球的味道,虛擬內存是一些系統頁文件,存放在磁盤上,每個系統頁文件大小也為4K,物理內存也被分頁,每個頁大小也為4K,這樣虛擬頁文件和物理內存頁就可以對應,實際上虛擬內存就是用于物理內存的臨時存放的磁盤空間。頁文件就是內存頁,物理內存中每頁叫物理頁,磁盤上的頁文件叫虛擬頁,物理頁+虛擬頁就是系統所以使用的頁文件的總和。還有映像頁文件和映射頁文件,映像頁文件就是拿程序本身當頁文件使用(而不是用系統的頁文件),映射頁文件就是使用磁盤上的文件(非系統頁文件)來當頁文件使用(這主要用于讀取文件)。虛擬地址頁的狀態:空閑:該區域沒有被所使用
4、,也沒有被預定,沒有和物理內存管理私有:該區域雖然沒有被使用,但是已經被申請(預定了),別人無法使用它。同樣也沒和物理內存關聯提交:該區域已經和物理內存管理,可以使用了虛擬內存和物理內存的管理(Windows內存管理的核心)Windows是多任務的系統,在每個進程創建時,系統為每個進程也創建了一個頁表,用于虛擬地址到物理地址的轉換。比如現在程序在執行進程A,用戶切換到了另外一個進程B,則系統會將進程A在內存中的數據存放到頁文件中,并更新進程A的頁表(使虛擬地址和頁文件形成映射)。然后讀取進程B的頁表,根據頁表判斷進程B的數據是在內存中還是在頁文件中(通過頁文件的類型來判斷),如果在內存中就直接
5、讀取,如果在頁面文件中,就將頁面文件內容讀入物理內存,然后更新頁表(使虛擬地址和物理內存形成映射)。這樣一看,虛擬內存實際上就是冒牌的物理內存了吧。程序的執行一個PE文件有數據區,代碼區,堆棧區(由系統分配,用于管理局部變量),使用OD載入一個程序就可以知道這些都是以二進制的形式保存在文件中。程序剛運行的時候,系統不直接將整個程序載入到物理內存中,也不將其載入到頁文件中,而是以程序文件本身作為頁文件形成映射(虛擬地址到頁文件的映射),建立頁表,然后隨著程序的執行通過頁表來將其虛擬地址轉換成物理地址(將頁文件讀入內存),然后在讀取內存中的指令或數據。當進程被切換時,將內存內容保存到頁文件,更新頁
6、表,如此往復,實現多任務操作。可以知道,程序的代碼段,數據段,堆棧區(系統分配)這些虛擬地址區域已經是映射狀態,即有相應的物理內存與之對應。系統為每個進程提供了2G的自己的虛擬地址空間,剩下的虛擬地址空間干什么用?剩下的虛擬地址空間就是給程序運行時動態分配內存使用。C+中 new的功能就是動態分配地址空間:申請內存的最小單位是區域,每個區域為CPU粒度大小,即64K,每次申請的內存都必須是64K的整數倍,C+ new功能申請一個區域,保留該區域,然后提交需要的頁,其他的保留。char *address=new char1024; /分配1K的內存這條語句首先申請一個區域的地址空間,表示這個區域
7、已經被預定了,這就是上述區域狀態中的私有狀態,雖然預定了,但是還沒有和物理內存關聯起來,所以程序也無法使用該內存,然后程序將這1K的內存提交,就是映射到了內存當中,區域的狀態就變成了映射狀態,這樣程序就可以使用這1K的內存了,而剩下的頁仍然為保留狀態。那當進程被切換時,這1K的進程存放在哪呢?程序本身的頁文件已經被代碼,全局數據,堆棧這些所使用了,所以系統會為自由存儲區分配的內存分配新的頁文件來做虛擬內存。局部變量的定義是由系統分配的,它將局部變量分配到堆棧區,因為堆棧區已經映射了,所以不用在映射,故不用使用新的頁文件了。堆棧區的大小為1M左右,如果分配的局部變量超過1M會產生堆棧溢出。可以看
8、到,系統的單個頁文件大小為4K,程序自己的虛擬空間地址從00010000到7FFEFFFF差不多是2G動態分配一個500M的內存后,物理內存,頁文件,可用的虛擬地址空間都減少了500M查詢內存狀態使用VirtualQuery(Addressn,&membaseinf,sizeof(MEMORY_BASIC_INFORMATION)定義3個變量char Stack20*1024; /存在堆棧中,堆棧在程序啟動時已經被映像到內存中了char* Dynamic=new char64*1024; /動態分配一個70K的內存char* Dynamic2=new char1024; /動態分配一個1K的內
9、存 地址所在頁面基地址:查詢的地址所在的頁面的起始地址頁面所在區域的基地址:頁面所在區域的起始地址區域保護屬性:分配區域時要設置區域的讀寫屬性從頁面基地址開始擁有相同屬性(空閑,保留,提交)的所有頁的字節數:可以看到這些都是4096的整數倍,因為一個頁4096,該大小一般都和申請的內存空間大小相當,因為這些內存都被提交了。申請一個內存空間的過程首先申請一個虛擬地址空間區域,然后提交申請的內存空間大小的頁(將其和頁文件關聯)。其他的地址空間保留。第一條指令分配了一個字符數組的局部變量,該變量分配在堆棧中,由系統分配,所以其區域為程序的靜態存儲區,即在程序啟動時候這個區域的所有虛擬地址就和程序文件本身映像了,所以局部變量的區域基地址都是一樣的,那為什么它的頁面文件類型是頁文件呢?不應該是exe映像么?因為現在文件在內存中,所有是物理頁,就是頁文件。第二條指令動態分配了一塊大小為1K的內存區域,這塊內存分配在自由存儲區,它所在的區域是在堆中申請的一個區域,第三條指令在堆中分配了一個70K左右的內存,因為他們是在堆中分配的,所以這2個變量的區域基地址是不一樣的。分配的區域有多大?第三條指令分配了一個70K左右的內存,它會向系統申請多大的區域呢?由區域大小為64K的整數倍知該區域
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 介入術后溶栓的護理
- 2025年網絡與新媒體專業課程期末考試試卷及答案
- 2025年數據科學與人工智能相關知識考試卷及答案
- 2025年經濟學原理考試卷及答案
- 2025年機器人技術工程師資格考試試題及答案
- 2025年自動化設備維護與管理培訓考試試卷及答案
- 2025年甘肅省武威市古浪縣民權鎮招聘大學生村文書筆試參考題庫及答案詳解一套
- 物資設施設備管理制度
- 物資采購對賬管理制度
- 特勤中隊車輛管理制度
- 英語歌曲欣賞troubleisafriend
- 郵輪乘務員職業道德與素養PPT完整全套教學課件
- 有限責任公司章程兩個及以上股東樣本
- 山東開放大學工作人員招聘考試真題2022
- 夏季預防中暑及中暑急救培訓PPT
- 地緣政治與中國的地緣戰略
- A0726 非授權人員進入保密要害部門、部位審批表
- DB11T 065-2022電氣防火檢測技術規范
- 2022年和政縣政務中心綜合窗口人員招聘筆試試題及答案解析
- 鋁電解電容器
- GB/T 10653-2001高聚物多孔彈性材料壓縮永久變形的測定
評論
0/150
提交評論