Linux C進程記憶體布局

來源:互聯網
上載者:User

標籤:style   blog   http   使用   os   檔案   資料   ar   

當程式檔案運行為進程時,進程在記憶體中獲得空間。這個空間是進程自己的記憶體空間。每個進程空間按照如下方式分為不同地區:

            

                                進程記憶體空間布局圖

text:程式碼片段。存放的是程式的全部代碼(指令),來源於二進位可執行檔中的代碼部分

 initialized data(簡稱data段)和uninitialized data(簡稱bss段)組成了資料區段。其中data段存放的是已初始化全域變數和已初始化static局部變數,來源於二進位可執行檔中的資料部分;

bss段存放的是未初始化全域變數和未初始化static局部變數,其內容不來源於二進位可執行檔中的資料部分(也就是說:二進位可執行檔中的資料部分沒有未初始化全域變數和未初始化static局部變數)。根據C語言標準規定,他們的初始值必須為0,因此bss段存放的是全0。將bss段清0的工作是由系統在載入二進位檔案後,開始執行程式前完成的,系統執行這個清0操作是由核心的一段程式碼完成的,這段代碼就是exec系統調用。

stack(棧)存放的是動態局部變數。也就是說,當子函數被調用時,系統會從棧中分配空間給該子函數的動態局部變數(注意:此時棧向記憶體低地址延伸);當子函數返回時,系統的棧會向記憶體高地址延伸,這相當於釋放子函數的動態局部變數的記憶體空間。

在進程啟動並執行過程中,通過調用和返回函數,控制權不斷在函數間轉移。進程可以在調用函數的時候,原函數的幀中儲存有在我們離開時的狀態,並為新的函數開闢所需的幀空間。在調用函數返回時,該函數的幀所佔據的空間隨著幀的彈出而清空。進程再次回到原函數的幀中儲存的狀態,並根據返回地址所指向的指令繼續執行。上面過程不斷繼續,棧不斷增長或減小,直到main()返回的時候,棧完全清空,進程結束。

當程式中使用malloc的時候,堆(heap)會向上增長,其增長的部分就成為malloc從記憶體中分配的空間。malloc開闢的空間會一直存在,直到我們用free系統調用來釋放,或者進程結束。一個經典的錯誤是記憶體流失(memory leakage), 就是指我們沒有釋放不再使用的堆空間,導致堆不斷增長,而記憶體可用空間不斷減少。

棧和堆的大小則會隨著進程的運行增大或者變小。當棧和堆增長到兩者相遇時候,也就是記憶體空間圖中的unused area地區完全消失的時候,再無可用記憶體。進程會出現棧溢出(stack overflow)的錯誤,導致進程終止。在現代電腦中,核心一般會為進程分配足夠多unused area地區,如果清理及時,棧溢出很容易避免。即便如此,記憶體負荷過大,依然可能出現棧溢出的情況。我們就需要增加實體記憶體了。

記憶體的最高端存放的是命令列參數和環境變數,將命令列參數和環境變數放到指定位置這個操作是由OS的一段代碼(exec系統調用)在載入二進位檔案到記憶體後,開始運行程式前完成的。

                

相關文章

聯繫我們

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