一、記憶體管理
硬體層次
記憶體結構管理
核心層次
記憶體對映
堆擴充套件
語言層次
c:malloc
c++:new
資料結構
stl 對多執行緒支援存在問題 對共享記憶體也存在問題 這倆個瓶頸
智慧型指標 在boost庫中
1.linux對記憶體的結構描述
1./proc/$/ 存放程序執行時候所有的資訊(包括記憶體結構)
任何程式的記憶體空間分成4個基本部分
1.**區
2.全域性棧區
3.堆
4.區域性棧
程序檢視 ps aue
自引導程式 /lib/ld-linux.so.x x是版本號。
在基於 gnu glibc 的系統上,包括所有 linux 系統,elf 可執行二進位制檔案的執行自動導致程式載入器被載入並且執行。載入器搜尋、引導程式所要使用的動態鏈結庫。
2.理解程式的變數與記憶體空間的關係
結論:
1.記憶體分四個區.
2.各種變數對應存放區
3.堆疊是一種管理記憶體的資料結構.
4.檢視程式的記憶體位址.
2.理解malloc的工作的原理
malloc使用乙個資料結構(鍊錶)維護分配空間
對malloc分配的空間不要越界訪問.因為容易破壞後台維護結構.
導致malloc/free/calloc/realloc不正常工作.
3.c++的new與malloc的關係
malloc new new
realloc new()
calloc new
free delete delete?
結論:new的實現使用的是malloc來實現的.
區別:new使用malloc後,還要初始化空間.
基本型別,直接初始化成預設值.
udt型別,呼叫指定的構造器
delete呼叫free實現.
delete負責呼叫析構器.然後再呼叫free
new與new區別
new只呼叫乙個構造器初始化.
new迴圈對每個區域呼叫構造器.
delete 與delete
4.函式呼叫棧空間的分配與釋放
4.1.總結:
1.函式執行的時候有自己的臨時棧.
2.函式的引數就在臨時棧中.如果函式傳遞實參.則用來初始化臨時引數變數.
3.通過積存器返回值.(使用返回值返回資料)
4.通過引數返回值.(引數必須是指標)
指標指向的區域必須事先分配.
5.如果引數返回指 針.引數就是雙指標.
4.2.__stdcall __cdecl __fastcall
1.決定函式棧壓棧的引數順序.
2.決定函式棧的清空方式
3.決定了函式的名字轉換方式.
5.far near huge指標
near 16
far 32
huge 綜合
二.虛擬記憶體
問題:
乙個程式不能訪問另外乙個程式的位址指向的空間.
理解:
1.每個程式的開始位址0x80084000
2.程式中使用的位址不是物理,而是邏輯位址(虛擬記憶體).
邏輯位址僅僅是編號.編號使用int 4位元組整數表示.
4294967296
每個程式提供了4g的訪問能力
問題:
邏輯位址與實體地址關聯才有意義:過程稱為記憶體對映.
背景:
虛擬記憶體的提出:禁止使用者直接訪問物理儲存裝置.
有助於系統的穩定.
結論:
虛擬位址與物理位址對映的時候有乙個基本單位:
4k 1000 記憶體頁.
段錯誤:無效訪問.
合法訪問:比如malloc分配的空間之外的空間可以訪問,但訪問非法.
三.虛擬記憶體的分配.
棧:編譯器自動生成**維護
堆:位址是否對映,對映的空間是否被管理.
1.brk/sbrk 記憶體對映函式
分配釋放記憶體:
int brk(void *end);//分配空間,釋放空間
void *sbrk(int size);//返回空間位址
應用:
1.使用sbrk分配空間
2.使用sbrk得到沒有對映的虛擬位址.
3.使用brk分配空間
4.使用brk釋放空間
理解:
sbrk(int size)
sbrk與brk後台系統維護乙個指標.
指標預設是null.
呼叫sbrk,判定指標是否是0,是:得到大塊空閒空間的首位址初始化指標.
同時把指標+size
否:返回指標void×(-1);
四.總結
智慧型指標
stl
new
malloc
brk/sbrk
異常處理
int brk(void*)
void *sbrk(int);
如果成功.brk返回0 sbrk返回指標
失敗 brk返回-1 sbrk返回(void*)-1
unix函式錯誤,修改內部變數:
errno
五.知識點
記憶體管理 從底層到上層分別有那些方式
c++中 new和malloc是怎麼執行的;
linux對記憶體的結構描述
系統是如何管理記憶體的
理解程式的變數與記憶體空間的關係
函式呼叫棧空間的分配和釋放 函式看一下stacall.txt;
為什麼提出虛擬記憶體的概念 安全;
記憶體對映
記憶體對映函式 brk和sbrk
虛擬記憶體
棧:編譯器自動生成**維護
堆:位址是否對映,對映的空間是否被管理.
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...
Linux記憶體管理
首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...