linux下的4G虛擬記憶體管理

2021-09-26 01:12:02 字數 1197 閱讀 4100

首先我們知道,記憶體可以分為三個部分,分別為靜態儲存區記憶體,棧區記憶體和堆區記憶體,其中他們各自有著好處和過人之處,在這裡主要來說明堆區記憶體

靜態儲存區儲存的變數為為全域性變數,或者可以用static修飾的變數,他的好處實是在整個程式的執行中一直存在,直到程式結束

棧區變數申請的是區域性變數或者auto修飾的變數,棧區變數的好處是使用方便,但是自由度小,他會隨著函式的結束而被釋放

我們知道在c/c++ 中定義的陣列大小必需要事先定義好,他們通常是分配在靜態記憶體空間或者是在棧記憶體空間內的,但是在實際工作中,我們有時候卻需要動態的為陣列分配大小,這時就要用到堆記憶體分配的概念。在堆記憶體中系統會通過鍊錶去滿足大小,堆記憶體是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆記憶體的大小受限於計算機系統中有效的虛擬記憶體。

首先需要標頭檔案 #

其中我們常用的是malloc函式,使用這個函式向系統申請

char *p = (char) malloc (sizeof(char));    // 其中(char)為強制轉換,也可以不寫就為隱式轉化,malloc 後面為字元的大小
其中malloc申請的記憶體不一定成功我們需要進行防錯

if p==null    //我們通過判斷指標是否為空

申請的空間也不一定乾淨,我們需要用 bzero函式

bzero (p,sizeof(char)) bzeroz 中第乙個變數應該為清零的首位址,後面為大小
最後使用完還需要釋放,用到free,為了防止記憶體洩漏

free (p)//釋放記憶體
1.:在free以後,空間不是真的釋放了,只是不再供你使用的,但是你還可以使用他,編譯器不會報錯,但是這時候這個指標就是乙個野指標了,使用非常危險,會造成不可預估的後果,建議在free之後,馬上把指標寫為null

2.:還有,當你在用乙個函式模組來申請空間的時候,一定要返回指標或者使用二級指標傳參,不然會導致記憶體洩露,因為當你的函式結束的時候,會釋放所用的資源,同樣的,你的指標也會被釋放,這樣你就找不到你要的指標,從而丟失那一片位址

同樣,我們還有檢視記憶體洩漏的軟體,大家可以用valgrind --tool

4G虛擬記憶體布局

為了保證程序執行的安全性,作業系統使用保護模式,系統不會直接訪問資料真實的位址,採用虛擬記憶體,虛擬記憶體與真實記憶體對映,通過對映關係來獲取檔案和資料。系統會給每個程序都分配乙個4g大小的虛擬記憶體 虛擬記憶體空間的布局 分為使用者空間 3g 和核心空間 1g 資料區為了方便理解是我自己劃分的 實...

Linux下的4G虛擬位址記憶體分布

開門見山 在編譯執行過程中,我們需要將我們的程式儲存到記憶體中才能調取執行,但是記憶體是有限的,不可能將所有的程序都放在記憶體中去,所以會給程序分配乙個4g的虛擬位址空間儲存資料,在程序執行時在對映到記憶體中去。一般情況下 windows下記憶體分布情況為 使用者態 核心態是 1 1 而在linux...

4G以上(含4G)記憶體與32位Linux系統

32位的桌面版ubuntu 估計其他發行版桌面版也是 預設不支援4g的記憶體,現如今有兩種方法,一種是安裝server版本的核心,另一種是啟用pae page address extension 實體地址擴充套件 即安裝pae核心。傳統的ia32架構只有32位位址匯流排,只能讓系統容納不超過4gb的...