從開發人員的角度學習Linux記憶體管理(1)

來源:互聯網
上載者:User

記憶體管理一向是所有作業系統書籍不惜筆墨重點討論的內容,無論市面上或是網上都充斥著大量涉及記憶體管理的教材和資料。因此,我們這裡所要寫的Linux記憶體管理採取避重就輕的策略,從理論層面就不去班門弄斧,貽笑大方了。我們最想做的和可能做到的是從開發人員的角度談談對記憶體管理的理解,最終目的是把我們在核心開發中使用記憶體的經驗和對Linux記憶體管理的認識與大家共用。

關於Linux核心的具體知識大家可以參考BKJIA精選譯文:Linux核心入門,包教會

進程如何使用記憶體?

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

對任何一個普通進程來講,它都會涉及到5種不同的資料區段。稍有編程知識的朋友都能想到這幾個資料區段中包含有“程式碼段”、“程式資料區段”、“程式堆棧段”等。不錯,這幾種資料區段都在其中,但除了以上幾種資料區段之外,進程還另外包含兩種資料區段。下面我們來簡單歸納一下進程對應的記憶體空間中所包含的5種不同的資料區。

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

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

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

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

棧:棧是使用者存放程式臨時建立的局部變數,也就是說我們函數括弧“{}”中定義的變數但不包括static聲明的變數,static意味著在資料區段中存放變數)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,並且待到調用結束後,函數的傳回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢複調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時資料的記憶體區。

進程如何組織這些地區?

上述幾種記憶體地區中資料區段、BSS和堆通常是被連續儲存的——記憶體位置上是連續的,而程式碼片段和棧往往會被獨立存放。有趣的是,堆和棧兩個地區關係很“曖昧”,他們一個向下“長”i386體繫結構中棧向下、堆向上),一個向上“長”,相對而生。但你不必擔心他們會碰頭,因為他們之間間隔很大到底大到多少,你可以從下面的例子程式計算一下),絕少有機會能碰到一起。

簡要描述了進程記憶體地區的分布:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.