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