windows下的虚拟内存分配分析
讓我們從原始的進(jìn)程創(chuàng)建開始分析吧。當(dāng)進(jìn)程創(chuàng)建后,操作系統(tǒng)給該進(jìn)程分配4GB的虛擬地址空間,這部分虛擬內(nèi)存是你的應(yīng)用程序看的到的區(qū)域(注意很大一部分是不能訪問的,比如:內(nèi)核區(qū)域,這部分加載了操作系統(tǒng)中的內(nèi)存管理,線程調(diào)度,文件系統(tǒng)和所有的設(shè)備驅(qū)動(dòng)程序的代碼,他們是所有進(jìn)程共享的地址空間,但是不能訪問)。當(dāng)分配完了虛擬地址空間后,其實(shí)這些地址空間還是空閑的,自由的,你此時(shí)還是不能使用這些空間,那怎么才能使用這些空間呢?保留。。保留是什么呢?(virtualAlloc)
保留: 要求操作系統(tǒng)在本進(jìn)程的虛擬地址空間里將指定的一段空出來,暫時(shí)不要給別的東西占用了,我先把這部分占好了,我以后來用。
現(xiàn)在我們只是進(jìn)行了保留操作,我們只是占有了這段內(nèi)存區(qū)域,怎么來使用呢?我們必須提交物理存儲(chǔ)器。麻煩又來了,物理存儲(chǔ)器是什么呢?我也沒在網(wǎng)上找到很多資料,下面只是個(gè)人的理解。
物理存儲(chǔ)器包括:計(jì)算機(jī)的內(nèi)存,操作系統(tǒng)的頁文件或你的exe/dll文件(用于內(nèi)存映射文件),一般說的最多的是頁文件。
順便解釋下頁文件是什么:我們都知道虛擬內(nèi)存有4GB,但是我們的物理內(nèi)存是沒有那么大的,此時(shí)我們需要把那些暫時(shí)不用的東西放到磁盤上去,Windows里面通常是存到一個(gè)叫pagefile.sys的文件里面,這個(gè)文件應(yīng)該就是頁文件。
上面提到提交物理存儲(chǔ)器其實(shí)就是將物理存儲(chǔ)器映射到那部分保留的地址空間(VirtualAlloc)。當(dāng)你的應(yīng)用程序不需要訪問這部分保留的地址空間的物理存儲(chǔ)器時(shí),就可以把它釋放了(VirtualFree)。
下面一個(gè)圖來進(jìn)一步的分析一下具體過程:
只要把這個(gè)看懂了,就基本上知道了windows下的基本虛擬內(nèi)存地址和物理內(nèi)存地址的映射了,進(jìn)程如何訪問虛擬內(nèi)存了。
最后來了解一下應(yīng)用程序啟動(dòng)的情況:
估計(jì)你會(huì)這樣認(rèn)為:系統(tǒng)必須將進(jìn)程的代碼和數(shù)據(jù)保留地址空間的一些區(qū)域,將屋里存儲(chǔ)器提交給這些區(qū)域,然后將代碼和數(shù)據(jù)從硬盤上的可執(zhí)行程序文件中拷貝到頁文件中已提交的物理存儲(chǔ)器中,然后再根據(jù)上面那幅圖來進(jìn)行頁交換,地址映射這些,這樣就完成了一個(gè)進(jìn)程的啟動(dòng)和運(yùn)行。
但真實(shí)的情況并不是這樣。啟動(dòng)應(yīng)用程序后,操作系統(tǒng)打開該應(yīng)用程序的exe文件,確定該應(yīng)用程序的代碼和數(shù)據(jù)的大小,然后系統(tǒng)要保留一部分地址空間,并指明與該區(qū)域相關(guān)聯(lián)的物理存儲(chǔ)器是在exe文件本身中,即系統(tǒng)并不是從頁文件中分配地址空間,不是從頁文件中拿出物理存儲(chǔ)器來提交到該保留區(qū)域,而是將exe文件映像(該文件的實(shí)際內(nèi)容:全部二進(jìn)制代碼,全局變量/靜態(tài)變量,導(dǎo)入段等)用作這部分保留區(qū)域。這樣程序就會(huì)加載的很快。其實(shí)這就是內(nèi)存映射文件的例子。
轉(zhuǎn)載于:https://www.cnblogs.com/suncoolcat/p/3283459.html
總結(jié)
以上是生活随笔為你收集整理的windows下的虚拟内存分配分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PAT】1009. Product o
- 下一篇: Windows SDK 非模态对话框的消