linux 記憶體管理

2021-06-26 15:16:21 字數 3115 閱讀 1476

一、記憶體管理

硬體層次

記憶體結構管理    

核心層次

記憶體對映

堆擴充套件                        

語言層次

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...