进程内存分配

栈区(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

posted @ 2018-06-26 13:52  insistYuan  阅读(7433)  评论(0编辑  收藏  举报