進程記憶體空間
正在啟動並執行程式,叫進程。每個進程都有完全屬於自己的,獨立的,不被幹擾的記憶體空間。此空間,被分成幾個段(Segment),分別是Text, Data, BSS, Heap, Stack。使用者進程記憶體空間,也是系統核心分配給該進程的VM(虛擬記憶體),但並不表示這個進程佔用了這麼多的RAM(實體記憶體)。這個空間有多大。命令top輸出的VIRT值告訴了我們各個進程記憶體空間的大小(進程記憶體空間隨著程式的執行會增大或者縮小)。你還可以通過/proc//maps,或者pmap –d 瞭解某個進程記憶體空間都分布。
一個linux進程分為幾個部分(從一個進程的地址空間的低地址向高地址增長):
1.text段,就是存放代碼,可讀可執行不可寫,也稱為本文段,程式碼片段。
2.data段,存放已初始化的全域變數和已初始化的static變數(不管是局部static變數還是全域static變數)
3.bss段,存放全域未初始設定變數和未初始化的static變數(也是不區分局部還是全域static變數)
以上這3部分是確定的,也就是不同的程式,以上3部分的大小都各不相同,因程式而異,若未初始化的全域變數定義的多了,那麼bss區就大點,反之則小點。
4.heap,也就是堆,堆在進程空間中是自低地址向高地址增長,你在程式中通過動態申請得到的記憶體空間(c中一般為malloc/free,c++中一般為new/delete),就是在堆中動態分配的。
5.stack,棧,程式中每個函數中的局部變數,都是存放在棧中,棧是自高地址向低地址增長的。起初,堆和棧之間有很大一段空間,然後隨著,程式的運行,堆不斷向高地址增長,棧不斷向低地址增長,這樣,堆跟棧之間的空間總有一個最大界限,超過這個最大界限,就會出現堆跟棧重疊,就會出錯,所以一般來說,Linux下的進程都有其最大空間的。
6.再往上,也就是一個進程地址空間的頂部,存放了命令列參數和環境變數。
進程的記憶體使用量情況比較複雜,這是因為: 進程申請的記憶體不一定真正會被用到 真正用到的記憶體也不一定是只有該進程自己在用 (比如動態共用程式庫)