windows記憶體結構 1

2021-08-10 19:18:22 字數 1389 閱讀 9720

作業系統使用的記憶體結構是理解作業系統如何執行的重要關鍵

建立程序時,系統會賦予程序4gb的虛擬空間位址(32位),16eb的虛擬空間(64位),32位從0x00000000-0xffffffff,64位從0x0000000000000000-0xffffffffffffffff

需要注意的是虛擬兩個字,虛擬表示這個空間位址不是真實存在的,是想象中的,這個位址有什麼用,我現在就來做說明

1.虛擬位址空間作用初步解說

我們知道,在程式中我們會用到各種各樣的指標,當我們申請到了乙個位址為0x12345678的位址,這時,虛擬的位址空間會對該位址做個記錄,同時將它對映到物理儲存器上即實體地址(如記憶體),同時該程序會建立一張表來維護該程序的虛擬位址到實體地址的對映。如果這個虛擬位址不被釋放,則這個虛擬空間的位址再也無法被申請到

2.虛擬位址空間的由來

早期的計算機系統在執行程式時都是將程式直接裝入記憶體,程式是直接執行在記憶體上的,假設有128mb記憶體,a,b兩個程序,a需要使用10mb記憶體,b使用50mb記憶體,那麼系統時如何分配記憶體的呢,先分配10mb記憶體給a,然後在剩下的118mb記憶體中分配50mb記憶體給b

但是這樣帶來兩個問題

1.程序的位址空間無法隔離,在a程序中可以惡意篡改b程序的資料,甚至系統的資料

2.程式執行的位址不確定,如果這個時候,還需要執行c程序,只能從剩下的記憶體中再分配給c程序,可以說程序的執行位址完全取決於當前系統狀況

3.記憶體使用效率低,如果再加乙個程序c,但是程序c需要70mb記憶體,因為剩下的記憶體不夠70mb,只能從記憶體中把某個程序的資料拷貝到硬碟,然後釋放該記憶體,然後把c載入到記憶體中,如此反反覆覆,效率極低(這就是記憶體分頁的原因)

虛擬位址空間可以在程式與實體地址之間做隔離,這個隔離我再舉個例子,程序a申請了乙個記憶體空間,位址為0x12345678,程序b也申請了乙個記憶體空間,位址為0x12345678,不要以為這兩個位址會衝突,這兩個位址可能會對映到物理儲存器不同的地方,而且被對映到的ram頁一定是空閒的(所以系統佔據的部分肯定不會被使用,保證了系統的安全)

現在我們來看看虛擬位址空間的分割槽

我們能使用的只有使用者方式的分割槽,核心方式的分割槽是系統所使用的,我們在程式中經常會遇到分配記憶體失敗返回0x00000000,當使用者訪問該位址時,由於這個位址屬於null分割槽,就會直接判定異常

我們發現,使用者方式分割槽趨近於2gb(32位),核心分割槽為2gb,這就表示,如果再程式中申請記憶體,一共只能申請2gb,或者最多只能申請2gb/4byte個int型別的指標(以上是我的理解,能看懂的就看)

其實在x86中也可以獲得3gb方式分割槽,只需要開啟/largeaddressaware開關,開啟之後,系統可以建立的執行緒,堆疊和其他資源的數量將減少

windows記憶體結構 2

為了解決記憶體使用效率低的問題,windows採用了記憶體分頁 每個cpu都使用64kb這個分配粒度,分配粒度是什麼呢,舉個例子,我申請了0x00010000處的記憶體空間,我只想申請1kb,但是系統會為你保留64kb 下面再說頁面大小,一般x86的頁面大小為4kb,alphacpu的頁面大小為8k...

windows和linux記憶體儲存結構

windows 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數 的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回...

Windows 記憶體結構體系(讀書筆記)

物理儲存器 頁交換檔案 虛擬位址空間 對映 虛擬位址空間 n定義 程式的記憶體位址空間。n 大小 在x86中,大小為4gb 在x64中,大小為16eb。n使用原則 1.使用virtualalloc預定記憶體位址空間,使用virtualfree釋放位址空間區域。2.當應用程式預定位址空間時,系統會確保...