1.程序就是编译出来的镜像,处于执行状态的程序叫进程.一个程序可以执行多次,每次执行会产生一个进程.
2.
程序镜像里有分成很多个段:
段其实就是在程序镜像文件里从一个位置到另一个位置范围里存放某种数据,便于系统在加载程序生成进程时的处理.
我们最需要注意的段:.text .rodata .data .bss
具体查看一个程序镜像里的段的内容可以通过反汇编查看:
objdump -D a.out
3.
.text段用于统一存放整个程序的代码指令
.rodata段用于统一存放整个程序的只读的数据内容.只读数据段里的内容只能读,如作写操作则会发生段错误.
存放只读的全局变量的值,字符串常量的值, 静态的只读的局部变量的值.(静态的局部变量可看成限制访问范围的全局变量)
.data段用于存放初始化过的全局变量的值,初始化过的静态局部变量值.注意初始化值为零时,不算是初始化过的.
.bss段用于存放未初始化的全局变量以及未初始化的静态局部变量
.rodata段与.data段在编译时,编译器就会在程序镜像中分配出把需的空间,.rodata段和.data段的内容越多,程序的镜像就会越大
bss段在编译时不会分配具体所需的空间,系统加载程序生成进程时才会具体分配空间的。、
4.进程只有一个栈.一个函数执行时,从栈里分配局部变量的空间,函数执行结束时会回收栈里分配的空间。回收的空间会重用的。栈空间上限不能超过8M,否则会段错误,
堆(heap):系统里用于动态分配空间的区域,分配出来的空间地址是从低往高分配的。
系统里只有一个堆。每个进程在堆里使用的空间是没有限制大小,只要系统还有可用内存即可申请成功。
动态分配出来的空间需要调用释放函数回收。
C: malloc() --- free()
C++: new --- delete