之前在学习C语言中,我们了解过程序的地址空间,它帮助我们理解了在函数内部定义的变量(自动变量),是在栈中;在堆中,可以用malloc,realloc进行内存申请。
在Linux学习中,我们知道,程序运行起来,就变成进程了,所以它们都是在内存中,因此程序的地址空间描述的是内存的地址空间(也就是说程序的地址空间是进程task_struct结构体内的一个成员),而这个程序的地址空间的内存并不是真正的物理内存,真正的内存需要程序地址空间这个虚拟的内存通过页表来映射。
进程的地址空间:
因此,每个进程都有一个独立的地址空间,现在就可以说明fork()函数创建子进程后,与父进程共享代码,其数据各自私有一份了。
所以,创建一个进程: 要创建进程(PCB)、创建进程的地址空间、为该进程创建页表、将硬盘上当前进程的代码和数据加载到内存、将地址空间和页表 和物理内存上的代码和数据封装,建立映射。