青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

Windows內存原理與內存管理(轉)

轉:http://hi.baidu.com/%D0%A1%B0%FC%D7%D349/blog/item/de1a8e4fa5eeafc3d0c86a68.html
1.進程地址空間
    Windows為每個進程分配了4GB的虛擬地址空間,讓每個進程都認為自己擁有4GB的內存空間,4GB怎么來的? 32位 CPU可以取地址的空間為2的32次方,就是4GB.
    當我們在Windows中雙擊一個應用程序圖標后,系統為該應用程序創建一個進程,Windows使得每個進程都擁有2GB的地址空間,這2GB地址空間用于程序存放代碼,數據,堆棧,自由存儲區(堆),另外2GB用于共享系統使用.

2.虛擬地址到實際地址的映射

 

    前面的這些地址并不是物理內存中的地址,而是該進程空間中的虛擬地址,虛擬空間只是Windows為該進程分配的一個虛擬的地址空間,只有當其和物理內存相關聯后才有意義.
2.1內存分頁
    每個物理地址對應一個虛擬地址?1GB那頁表該有多長,所以將內存分頁管理,4K為一頁,即4K就是一個最小單位。
2.2建立映射--分頁
    進程被創建時會建立一個虛擬內從到物理內存的映射表--頁表,根據頁表可以將虛擬內存和物理內存關聯起來.

2.3虛擬內存
    就是把磁盤拿來當內存用,這是以前買電腦時的想法。所以就一直都想不明白一個問題:要真是這樣,那內存分個什么1GB,2GB,4GB,大家都買個1M的內存條,然后把自己磁盤拿來當內存用多好,比2GB,4GB不知道要大多少。
    其實這個說法有一點擦邊球的味道,虛擬內存是一些系統頁文件,存放在磁盤上,每個系統頁文件大小也為4K,物理內存也被分頁,每個頁大小也為4K,這樣虛擬頁文件和物理內存頁就可以對應,實際上虛擬內存就是用于物理內存的臨時存放的磁盤空間

    頁文件就是內存頁,物理內存中每頁叫物理頁磁盤上的頁文件叫虛擬頁物理頁+虛擬頁就是系統所以使用的頁文件的總和。還有映像頁文件和映射頁文件,映像頁文件就是拿程序本身當頁文件使用(而不是用系統的頁文件),映射頁文件就是使用磁盤上的文件(非系統頁文件)來當頁文件使用(這主要用于讀取文件)

    虛擬地址頁的狀態
    (1)空閑:該區域沒有被所使用,也沒有被預定,沒有和物理內存管理
    (2)私有:該區域雖然沒有被使用,但是已經被申請(預定了),別人無法使用它。同樣也沒和物理內存關聯
    (3)提交:該區域已經和物理內存管理,可以使用了
2.4虛擬內存和物理內存的管理
    Windows是多任務的系統,在每個進程創建時,系統為每個進程也創建了一個頁表,用于虛擬地址到物理地址的轉換。比如現在程序在執行進程A,用戶切換到了另外一個進程B,則系統會將進程A在內存中的數據存放到頁文件中,并更新進程A的頁表(使虛擬地址和頁文件形成映射)。然后讀取進程B的頁表,根據頁表判斷進程B的數據是在內存中還是在頁文件中(通過頁文件的類型來判斷),如果在內存中就直接讀取,如果在頁面文件中,就將頁面文件內容讀入物理內存,然后更新頁表(使虛擬地址和物理內存形成映射)。這樣一看,虛擬內存實際上就是冒牌的物理內存了吧。
3.程序執行
    一個PE文件有數據區,代碼區,堆棧區(由系統分配,用于管理局部變量),使用OD載入一個程序就可以知道這些都是以二進制的形式保存在文件中。
    程序剛運行的時候,系統不直接將整個程序載入到物理內存中,也不將其載入到頁文件中,而是以程序文件本身作為頁文件形成映射(虛擬地址到頁文件的映射),建立頁表,然后隨著程序的執行通過頁表來將其虛擬地址轉換成物理地址(將頁文件讀入內存),然后在讀取內存中的指令或數據。當進程被切換時,將內存內容保存到頁文件,更新頁表,如此往復,實現多任務操作。

    可以知道,程序的代碼段,數據段,堆棧區(系統分配)這些虛擬地址區域已經是映射狀態,即有相應的物理內存與之對應。系統為每個進程提供了2G的自己的虛擬地址空間,剩下的虛擬地址空間干什么用?
    剩下的虛擬地址空間就是給程序運行時動態分配內存使用。C++中 new的功能就是動態分配地址空間:
    申請內存的最小單位是區域,每個區域為CPU粒度大小,即64K,每次申請的內存都必須是64K的整數倍,C++ new功能申請一個區域,保留該區域,然后提交需要的頁,其他的保留。  
    char *address=new char[1024];   //分配1K的內存
    這條語句首先申請一個區域的地址空間,表示這個區域已經被預定了,這就是上述區域狀態中的私有狀態,雖然預定了,但是還沒有和物理內存關聯起來,所以程序也無法使用該內存,然后程序將這1K的內存提交,就是映射到了內存當中,區域的狀態就變成了映射狀態,這樣程序就可以使用這1K的內存了,而剩下的頁仍然為保留狀態。那當進程被切換時,這1K的進程存放在哪呢?程序本身的頁文件已經被代碼,全局數據,堆棧這些所使用了,所以系統會為自由存儲區分配的內存分配新的頁文件來做虛擬內存。

    局部變量的定義是由系統分配的,它將局部變量分配到堆棧區,因為堆棧區已經映射了,所以不用在映射,故不用使用新的頁文件了。堆棧區的大小為1M左右,如果分配的局部變量超過1M會產生堆棧溢出。

    可以看到,系統的單個頁文件大小為4K,程序自己的虛擬空間地址00010000到7FFEFFFF差不多是2G動態分配一個500M的內存后,物理內存,頁文件,可用的虛擬地址空間都減少了500M
    查詢內存狀態使用VirtualQuery(Address[n],&membaseinf,sizeof(MEMORY_BASIC_INFORMATION))
定義3個變量
char Stack[20*1024];//存在堆棧中,堆棧在程序啟動時已經被映像到內存中了
char* Dynamic=new char[64*1024];  //動態分配一個70K的內存
char* Dynamic2=new char[1024];  //動態分配一個1K的內存

參數說明:

地址所在頁面基地址:查詢的地址所在的頁面的起始地址
頁面所在區域的基地址:頁面所在區域的起始地址
區域保護屬性:分配區域時要設置區域的讀寫屬性
從頁面基地址開始擁有相同屬性(空閑,保留,提交)的所有頁的字節數:可以看到這些都是4096的整數倍,因為一個頁4096,該大小一般都和申請的內存空間大小相當,因為這些內存都被提交了。

申請一個內存空間的過程
首先申請一個虛擬地址空間區域,然后提交申請的內存空間大小的頁(將其和頁文件關聯)。其他的地址空間保留。

第一條指令分配了一個字符數組的局部變量,該變量分配在堆棧中,由系統分配,所以其區域為程序的靜態存儲區,即在程序啟動時候這個區域的所有虛擬地址就和程序文件本身映像了,所以局部變量的區域基地址都是一樣的,那為什么它的頁面文件類型是頁文件呢?不應該是exe映像么?因為現在文件在內存中,所有是物理頁,就是頁文件。

第二條指令動態分配了一塊大小為1K的內存區域,這塊內存分配在自由存儲區,它所在的區域是在堆中申請的一個區域,第三條指令在堆中分配了一個70K左右的內存,因為他們是在堆中分配的,所以這2個變量的區域基地址是不一樣的。

分配的區域有多大?
第三條指令分配了一個70K左右的內存,它會向系統申請多大的區域呢?由區域大小為64K的整數倍知該區域至少為128K,查詢這70K之后的虛擬地址的狀態

可以看到該地址所在的區域和Dynamic是一樣的,它的基地址為580000(轉載者加:不應該是594000吧),在那70K之后,這之后的區域的狀態為保留,說明系統保留了剩下的區域,這剩下的區域有966656,就是966K左右的大小,那整個區域的大小就是(0x14000)81920+966656。

posted on 2010-04-15 00:58 大龍 閱讀(3457) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情第二页| 久久女同互慰一区二区三区| 久久免费观看视频| 亚洲一区三区电影在线观看| 国产精品爱久久久久久久| 亚洲精品国产欧美| 亚洲精品一区二区三区福利| 亚洲精品在线电影| 欧美色欧美亚洲高清在线视频| 亚洲一区二区三区成人在线视频精品| 亚洲美女淫视频| 国内精品久久久| 久久国产精品亚洲va麻豆| 老牛影视一区二区三区| 亚洲国产成人一区| 欧美日韩国产首页在线观看| 亚洲欧美一区二区三区在线| 久久久久久婷| 欧美aⅴ一区二区三区视频| 日韩午夜精品| 国产亚洲精品aa| 欧美性大战久久久久| 国产精品色婷婷| 欧美h视频在线| 午夜精品视频在线观看一区二区 | 国产真实精品久久二三区| 亚洲国产精品一区在线观看不卡 | 亚洲高清免费在线| 日韩视频一区二区三区| 欧美制服丝袜| 中文网丁香综合网| 樱桃成人精品视频在线播放| 欧美日本一区| 免费不卡在线视频| 一区二区三区www| 欧美成人dvd在线视频| 亚洲人成网站777色婷婷| 亚洲免费在线视频| 亚洲一区二区黄| 欧美99在线视频观看| 国产欧美一区二区三区在线老狼| 欧美日韩精品综合在线| 国产专区精品视频| 亚洲影院在线| 日韩视频永久免费观看| 亚洲国产精品一区二区www在线| 欧美一区二区啪啪| 亚洲欧美日韩精品久久亚洲区 | 性欧美暴力猛交69hd| 宅男噜噜噜66一区二区| 在线成人国产| 欧美资源在线观看| 亚洲国产一区二区a毛片| 亚洲欧美亚洲| 亚洲第一视频网站| 国产精品麻豆va在线播放| 欧美成人一区二区三区| 久久这里只有精品视频首页| 欧美一区二区视频网站| 久久精品在线播放| 欧美一区二区三区啪啪| 欧美视频一区二区在线观看| 亚洲欧洲午夜| 亚洲欧洲精品一区二区| 开元免费观看欧美电视剧网站| 亚洲一区二区成人在线观看| 欧美日韩美女| 国产精品美女久久久| 亚洲无线观看| 亚洲国产乱码最新视频 | 99精品欧美一区二区蜜桃免费| 免费视频亚洲| 在线中文字幕不卡| 久久gogo国模裸体人体| 米奇777在线欧美播放| 国产日韩欧美91| 亚洲国产精品成人精品| 蜜桃精品久久久久久久免费影院| 西瓜成人精品人成网站| 国产精品一区二区久激情瑜伽| 在线精品观看| 欧美大片一区二区三区| 91久久在线观看| 欧美一区二区三区在线观看| 好看的日韩视频| 99在线|亚洲一区二区| 欧美在线91| 欧美在线国产精品| 亚洲国产cao| av成人激情| 欧美国产亚洲精品久久久8v| 亚洲美女av网站| 亚洲淫性视频| 亚洲人成7777| 亚洲一区二区三区高清 | 欧美成人精品在线| 久久夜色精品国产亚洲aⅴ| 国产精品免费区二区三区观看| 久久爱www久久做| 巨乳诱惑日韩免费av| 一卡二卡3卡四卡高清精品视频| 日韩一区二区电影网| 国产综合色在线视频区| 99re国产精品| 伊人久久大香线| 日韩一级二级三级| 亚洲国产精品久久久久秋霞蜜臀 | 欧美在线视频播放| 蜜桃av噜噜一区二区三区| 亚洲永久精品国产| 老司机免费视频久久| 亚洲欧美日韩第一区 | 国产一级一区二区| 最新亚洲一区| 激情五月综合色婷婷一区二区| 午夜一区不卡| 欧美va亚洲va日韩∨a综合色| 午夜在线成人av| 欧美日韩1080p| 欧美激情亚洲综合一区| 免费不卡亚洲欧美| 久久成人久久爱| 国产精品盗摄久久久| 亚洲男人影院| 欧美激情在线播放| 亚洲性线免费观看视频成熟| 久久综合色影院| 久久亚洲国产精品日日av夜夜| 欧美在线高清| 欧美一区二区三区在线观看视频| 欧美精品二区| 亚洲第一黄色| 欧美高清视频一二三区| 久久精品日韩| 久久久久这里只有精品| 伊人婷婷欧美激情| 在线视频亚洲欧美| 亚洲视频 欧洲视频| 欧美激情一区二区三级高清视频 | 国产亚洲一区二区三区在线观看| 在线亚洲精品| 亚洲欧美春色| 国产嫩草影院久久久久| 亚洲一级在线观看| 亚洲大片av| 麻豆精品视频在线观看| 免费日韩成人| 亚洲精品国产无天堂网2021| 亚洲视频一区在线| 亚洲天堂av在线免费| 欧美香蕉大胸在线视频观看| 这里只有精品丝袜| 欧美一区2区三区4区公司二百| 国产精品日本精品| 午夜精品久久| 猛男gaygay欧美视频| 一本一本久久a久久精品综合妖精| 欧美特黄一级大片| 性亚洲最疯狂xxxx高清| 久久综合色婷婷| 亚洲精品视频中文字幕| 国产精品久久久久9999| 亚洲欧美电影院| 欧美成人精精品一区二区频| 亚洲精品免费在线观看| 国产精品国产精品| 久久精品综合| 亚洲精品视频二区| 香蕉av福利精品导航| 亚洲成人自拍视频| 国产一区二区在线观看免费| 久久影院亚洲| 日韩午夜高潮| 欧美一区网站| 亚洲激情av| 国产精品高清网站| 久久久久在线观看| 中文亚洲视频在线| 欧美成人午夜激情在线| 亚洲影院免费观看| 亚洲激情在线观看视频免费| 国产精品毛片大码女人| 久久婷婷激情| 亚洲一区欧美二区| 91久久久在线| 久久久天天操| 亚洲尤物影院| 亚洲欧洲精品成人久久奇米网| 欧美午夜精品久久久| 久久一本综合频道| 午夜精品理论片| 一本大道av伊人久久综合| 久久中文字幕导航| 香蕉久久精品日日躁夜夜躁| 日韩一级裸体免费视频| 1204国产成人精品视频| 国产一区自拍视频| 国产亚洲精久久久久久| 国产伦精品一区二区三区高清 | 欧美猛交免费看|