進程內存分配


棧區(stack)

  由編譯器自動分配和釋放,存放函數的參數值,局部變量的值等。其他操作類似於數據結構中的棧。

堆區(heap)

  一般有程序員分配和釋放,若程序員不釋放,程序結束后可能有OS回收。它和數據結構中的堆不是一回事,分配方式類似於鏈表。

全局區(靜態區static)

  全局變量和靜態變量存儲在這一區域,初始化的全局變量和靜態變量在這一區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一區域。程序結束后由系統釋放。

文字常量區

  常量字符串存放在這一區域。程序結束后由系統釋放。

程序代碼區

  存放函數體的二進制代碼。

進程內存分配圖

高地址

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

低地址

段區名

解釋

內容

stack

棧:局部變量

1、在函數內部定義的局部變量(非static型)

2、中斷發生時存放的運行環境

room

增長空間:堆向上長,棧向下長

堆和棧動態變化的空間,

1、堆從低地址向上動態增長

2、棧從高地址向下動態增長

heap

堆:動態分配的內存空間

1、程序運行時動態分配的空間,如malloc函數,new等

2、動態釋放,如free函數,delete等

other

其他

 

.bss

未初始化的全局變量區

函數外部定義的(全局變量),如

1、   int I;

2、   static int j;

.data

已初始化的全局變量區

1、函數外定義的:static int i = 0;

2、函數內部定義的:static int j;//編譯器自動初始化為0

.text

可執行文件

1、程序代碼,即當前CPU的二進制機器碼

2、常量,如const char msg[]=”hello world\n”

注:

  1、單片機,可執行文件一般沒必要加載到內存中,也就不存在.text段。

  2、對於多任務系統來說,一個進程的內存分配往往是動態的,因此堆區實際地址空間可能不連續。

  3、棧區作為存放局部變量的區域,往往可以設置其最大大小,運行時超出定義大小則會產生越界錯誤(段錯誤的一種)。

  4、text段在內存中映射為只讀,data和bss是可讀可寫的。

  5、data段和bss段屬於靜態內存分配。data是初始化過的,bss是未初始化的。

  6、stack保存在函數的局部變量(不包含static聲明的變量)、參數以及返回值。

  7、傳入的參數和局部變量都在棧頂分布,隨着子函數的增長向下增長。

  8、函數的調用地址(函數運行代碼),全局變量,靜態變量分配載內存的低地址上,而malloc分配的堆在這些內存之上,並向上增長。

       unix系統進程內存占用示意圖

 

            代碼段內容表

 

參考:

  https://blog.csdn.net/hitman_cs/article/details/70599071

  https://blog.csdn.net/qq792326645/article/details/49783347

  https://blog.csdn.net/love_gaohz/article/details/41310597


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM