Linux記憶體管理

2022-05-31 14:15:13 字數 1276 閱讀 7383

linux記憶體管理

毫無疑問,所有程序(執行的程式)都必須占用一定數量的記憶體,它或是用來存放從磁碟載入的程式**,或是存放取自使用者輸入的資料等等。不過程序對這些記憶體的管理方式因記憶體用途不一而不盡相同,有些記憶體是事先靜態分配和統一**的,而有些卻是按需要動態分配和**的。

對任何乙個普通程序來講,它都會涉及到5種不同的資料段。

**段:**段是用來存放可執行檔案的操作指令,也就是說是它是可執行程式在記憶體中的映象。**段需要防止在執行時被非法修改,所以只准許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

資料段:資料段用來存放可執行檔案中已初始化全域性變數,換句話說就是存放程式靜態分配[1]的變數和全域性變數。

bss段[2]:bss段包含了程式中未初始化的全域性變數,在記憶體中 bss段全部置零。

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧:棧是使用者存放程式臨時 建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函 數被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/ 恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

程序記憶體空間

linux作業系統採用虛擬記憶體管理技術,使得每個程序都有各自互不干涉的程序位址空間。該空間是塊大小為4g的線性虛擬空間,使用者所看到和接觸到的都是該虛擬位址,無法看到實際的物理記憶體位址。利用這種虛擬位址不但能起到保護作業系統的效果(使用者不能直接訪問物理記憶體),而且更重要的是,使用者程式可使用比實際物理記憶體更大的位址空間

第一、4g的程序位址空間被人為的分為兩個部分——使用者空間與核心空間。使用者空間從0到3g(0xc0000000),核心空間佔據3g到4g。使用者程序通常情況下只能訪問使用者空間的虛擬位址,不能訪問核心空間虛擬位址。只有使用者程序進行系統呼叫(代表使用者程序在核心態執行)等時刻可以訪問到核心空間。

第二、使用者空間對應程序,所以每當程序切換,使用者空間就會跟著變化;而核心空間是由核心負責對映,它並不會跟著程序改變,是固定的。核心空間位址有自己對應的頁表(init_mm.pgd),使用者程序各自有不同的頁表。

第三、每個程序的使用者空間都是完全獨立、互不相干的。不信的話,你可以把上面的程式同時執行10次(當然為了同時執行,讓它們在返回前一同睡眠100秒吧),你會看到10個程序占用的線性位址一模一樣。

Linux記憶體管理

本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...

Linux記憶體管理

本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...

Linux記憶體管理

首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...