為了解決記憶體使用效率低的問題,windows採用了記憶體分頁
每個cpu都使用64kb這個分配粒度,分配粒度是什麼呢,舉個例子,我申請了0x00010000處的記憶體空間,我只想申請1kb,但是系統會為你保留64kb
下面再說頁面大小,一般x86的頁面大小為4kb,alphacpu的頁面大小為8kb,不管申請多大記憶體,但是實際申請記憶體大小一定是頁面大小的倍數
如果申請1kb,則在x86平台上申請的實際大小為4kb,alpha平台上則為8kb
記憶體按4kb分頁,每4kb分一頁,每個記憶體頁都有自己的屬性
這裡大部分都很明白,只有page_writecopy,page_execute_writecopy屬性需要說明一下
page_writecopy:寫入時複製,舉個例子,開啟1個同樣的txt檔案10次,由於所有的例項共享**和資料頁面,如果修改了乙個例項,會造成其他的例項的顯示頁面發生變化嗎,顯然不會,這就是這個頁面屬性在發生作用,
在修改顯示頁面時,發生了一下事情
1.系統會尋找乙個空閒的ram頁面(如果找不到,就需要釋放乙個非空閒的頁面,如果這個頁面沒有被作廢,直接釋放,否則,需要把這個頁面寫到硬碟上儲存起來)
2.系統會把原始的頁面的內容複製到空閒的ram頁面,在新的頁面上對內容進行修改
3.系統更新程序的頁面表,使得被訪問的虛擬位址被轉換成新的ram頁面
如果要使用虛擬記憶體,則不得不提到virtualalloc函式
lpvoid virtualalloc;
flallocationtype為mem_reserve時,保留指定位址空間,不分配物理記憶體,這樣可以阻止其他記憶體分配函式malloc和localalloc等再使用已保留的記憶體範圍,直到它被被釋放
flallocationtype為mem_commit是,把位址提交到物理儲存器,此時提交的記憶體初始化為0,這時這個位址就可以使用了
windows記憶體結構 1
作業系統使用的記憶體結構是理解作業系統如何執行的重要關鍵 建立程序時,系統會賦予程序4gb的虛擬空間位址 32位 16eb的虛擬空間 64位 32位從0x00000000 0xffffffff,64位從0x0000000000000000 0xffffffffffffffff 需要注意的是虛擬兩個字...
windows和linux記憶體儲存結構
windows 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數 的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回...
Windows記憶體管理(2) Lookaside
1.lookaside結構 頻繁的申請和 記憶體,會導致在記憶體上產生大量的記憶體 空洞 從而導致最終無法申請記憶體。ddk為程式設計師提供了 lookaside 結構來解決這個問題。我們可以將 lookaside 物件看成是乙個記憶體容器。在初始化的時候,它先向 windows 申請了一塊比較大的...