进程的内存空间
每个进程所分配的内存由很多部分组成:
-
代码区
包含了进程运行的程序机器语言指令。代码段一般是只读的,以防止进程意外修改自身指令。因为多个进程可同时运行同一程序,所以又将代码段设为共享,这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中。 -
初始化数据段
也称数据段,包含初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件中读取这些变量的值。 -
未初始化数据段
此段常被称为BSS段,包含未进行初始化的全局变量和静态变量。程序启动之前,系统将本段内所有内存初始化为0。
(在 C++中,已经不再严格区分bss和data了,它们共享一块内存区域) -
堆
一般由程序员分配释放,不连续的虚拟内存,区别于数据结构中的堆。 -
栈
由编译器自动分配释放,连续的物理内存,存放函数的参数值,局部变量等,其操作方式类似于数据结构中的栈。
从高地址到低地址:
区分内核空间和用户空间的原因:
- 操作系统的数据都是存放于内核空间的,用户进程的数据是存放于用户空间的;
- 分开来存放,就让系统的数据和用户的数据互不干扰,防止用户程序误操作或者恶意破坏系统,保证系统的稳定性,并且管理较方便。
int a = 0; //全局初始化区
char *p1; //全局未初始化区
int Sum(int a, int b){
return a+b; //栈
}
int main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区(全局区),p3在栈上。
static int c =0; //全局初始化区
p1 = new char[10]; //分配得来的10字节的区域在堆区
}