当在Linux终端中输入ps来查看当前进程时(终端暂无其他运行进程),会出现两个进程,一个是刚输入的ps,另一个是bash,仔细观察,ps的PPID是bash的PID,也就是说ps是bash的子进程,bash是ps的父进程,这就说明ps在启动时,执行的还是bash,那又是怎样完成高效的转换的呢?
今天就来说复制进程fork:
图中展示了父进程和子进程的关系,父进程通过fork()复制后(要明确,复制的是整个PCB,PID是PCB结构体中的一个成员),然后经返回值返回,这时可以判断是父进程还是子进程,父进程返回值>0(第一个进程从1开始 )。所以,调用fork()的是父进程,新复制的称为子进程。
fork()的优化——写时拷贝技术,可以延迟页面的拷贝,甚至免除页面的拷贝。和复制进程的最大区别就是,写时拷贝先拷贝页表,有修改时再复制,若无修改也就达到了免除页面的拷贝。还有一个需要注意的地方:写时拷贝是以页为单位的,哪怕这个页中只有一个字节被修改了,我们也需要将整个页面都复制出来一份(一页一般说是4K)。