進程的記憶體布局

來源:互聯網
上載者:User

 

Linux記憶體管理機制

    Linux的記憶體管理主要由兩個部分組成,一個部分負責實體記憶體的申請與釋放,實體記憶體的申請與釋放最小單位與Windows一樣,都是以"頁"為單位,在IA32中頁的大小是4 KB;另外一個部分負責處理虛擬記憶體,虛擬記憶體的操作主要包括虛擬位址空間與實際儲存空間的映射,實體記憶體頁與硬碟頁之間的置換等,下面各節分別介紹這幾個方面的內容。

進程的記憶體布局

    一個32位Linux進程的地址空間為4 GB,與Windows類似,這個4 GB空間並不能全部被一個Linux進程的使用者空間代碼使用,而是有一部分留給了核心。但與Windows不同,Linux中4 GB的高位1 GB空間留給了核心,低位的3 GB由進程使用者代碼使用,5-7所示。

0X00000000~0XBFFFFFFF這一3 GB地區為使用者地址空間,而上面的0XC0000000 ~ 0XFFFFFFFF這一1 GB地區保留給核心使用。使用者地址空間進一步被分成程式碼區、資料區(包括初始化資料區DATA和未初始化資料區BSS)、堆和棧。程式碼區佔據最底端,緊接著往上為資料區,先是初始化資料區,然後是未初始化資料區。代碼區中存放應用程式的機器代碼,運行過程中代碼不能被修改,因此代碼區記憶體為唯讀,且大小固定。資料區中存放了應用程式中的全域資料,待用資料和一些常量字串等。資料區的大小也是固定的。

 
圖5-7  一個32位Linux進程的地址空間

    5-8所示,除了代碼區,初始化資料區和未初始化資料區之外,還有兩個動態增長和縮減的地區即堆和棧。

    堆從未初始化資料區開始,向上端動態增長,增長過程中虛擬位址值變大;而棧則從高位地址開始,向下端動態增長,虛擬位址值變小。

    堆是應用程式在運行過程中動態申請的記憶體空間,如開發人員通過malloc/new需要動態產生對象或者開闢記憶體空間時,最終會調用系統調用brk來動態調整資料區的大小。當這些動態記憶體地區使用完畢,需要開發人員明確使用相應的free/delete釋放這些記憶體空間。free/delete最終也會調用到brk調整資料區的大小。

 
圖5-8  堆和棧

    棧與堆有明顯的區別,棧用來存放函數的傳入參數、臨時變數,以及返回地址等資料。這些資料不需要通過malloc/new來為之開闢記憶體空間,而且其增長與縮減是因為函數的調用與返回,而不必開發人員的額外操作。堆空間的維護不需要開發人員的參與,而且也沒有記憶體流失的危險。

    初始化資料區和未初始化資料區還有一些值得注意的事情,初始化資料區存放的是那些在編譯期就能夠知道由程式設定初始值的全域變數及靜態變數等。這些初始值必須儲存在最終產生的二進位檔案中,並且在程式運行時會原封不動地將這個區域對應到進程的初始化資料區域。當程式聲明N個這樣的初始化資料,且其空間佔據M大小,那麼在二進位檔案中,就會開闢M大小的地區。即依次存放N個資料,且每個都設定了相應的初始值。當程式運行時,這塊地區就會原封不動地映射到該對應進程的"初始化資料區"。"原封不動"意味著在二進位檔案中這塊地區的大小與進程虛擬位址空間中一樣大,而且排列和對應地址的值也一樣。

    但未初始化資料區則不如此,如果一個全域變數或者靜態變數在原始碼檔案中沒有被賦予初始值,那麼在程式啟動後,在第1次被賦值前,其初始值為0。即這些資料本質上還是有初始值的,只不過初始值為0。但是當最終產生二進位檔案時,這些未初始化資料區並不會像初始化資料區那樣,佔據它們對應變數的總大小的地區,而只是用一個值來記錄其總大小。比如,一個程式的代碼指令有100 KB大小,所有的初始化資料總大小為100KB,所有的未初始化資料總大小為150 KB,那麼在最終產生的二進位檔案中,代碼區會有100 KB。接著100 KB大小的初始化資料區,然後接著一個4個位元組大小的空間,其值為150×1024(指示其大小為150 KB),注意,這裡不是一個150 KB大小的所有單元值都為0的空間。這樣可以節省二進位檔案的大小,即節省硬碟空間。但是在進程虛擬位址空間中,對應於這一地區的未初始化資料區的大小必須是150 KB。因為在程式運行時,程式必須能夠真正訪問到這些變數中的每一個。這也意味著,當程式啟動時,當監測到二進位檔案中未初始化資料區的那個值為150×1024時,系統會開闢出一個150 kB大小的地區作為進程的未初始化資料區域並且同時用0來初始化這一地區。

 

http://book.51cto.com/art/201006/203601.htm

 

聯繫我們

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