linux記憶體理解和整理__linux

來源:互聯網
上載者:User

進程記憶體空間

正在啟動並執行程式,叫進程。每個進程都有完全屬於自己的,獨立的,不被幹擾的記憶體空間。此空間,被分成幾個段(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.再往上,也就是一個進程地址空間的頂部,存放了命令列參數和環境變數。


進程的記憶體使用量情況比較複雜,這是因為: 進程申請的記憶體不一定真正會被用到 真正用到的記憶體也不一定是只有該進程自己在用 (比如動態共用程式庫)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.