https://note.youdao.com/s/71lWGFsI
图片我懒的粘贴过来了,上面是源笔记链接,想看全的请移步。
进程是系统中基本的执行单位。
Linux中,用户可以创建子进程,子进程存在系统中,独立于父进程,子进程可以接受系统的调度,可以分配得到系统资源。系统可以检查到子进程的存在,且可以拥有与父进程同样的权利。
fork()函数不需要传入参数,返回值是一个进程的ID,一次调用返回俩个值。一个是返回给父进程的,父进程得到的是创建子进程时候,子进程的ID。另一个是返回给子进程,子进程得到的是一个pid_t = 0 的值,由于0号进程是内核进程,所以子进程的进程号不可能为0,所以可以用来区别谁是父,谁是子。
fork()流程
fork()在创建一个进程后,并从内核中分配一个进程ID(新ID)给在个新进程。然后为这个新进程分配进程空间,并将父进程的进程空间中的内容复制到子进程的进程空间中,这些被复制的内容包括:数据段、堆栈段(在虚拟地址空间上父进程与子进程,数据段与堆栈段是不一样的,但是在实际物理地址空间上,他们是共同使用一段物理地址空间。只有当子进程开始修改父进程的数据段或堆栈段的时候,才会为子进程分配一段新数据段、堆栈段的物理地址空间。这就是的是写时复制)。然后代码段是与父进程共享的。所以创建出来的子进程其实就是父进程的一个复制版。
如果代说码段不是共享的话,那么操作系统需要:
为子进程的页表分配页帧
为子进程的页分配页帧
初始化子进程的页表
把父进程的