-
我们都知道父进程可以通过fork()函数创建一个子进程。
-
创建出的子进程为父进程的副本,除了Pid 其他都相同;
-
实际上,父进程只拷贝了自己的PCB块,但物理内存(包括代码段,数据段和用户堆栈都用的一样的,共享的),只有虚拟空间不同。
-
PCB一般包括:
1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字
2.特征信息:一般分系统进程、用户进程、或者内核进程等
3.进程状态:运行、就绪、阻塞,表示进程现的运行情况
4.优先级:表示获得CPU控制权的优先级大小
5.通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道
6.现场保护区:保护阻塞的进程用
7.资源需求、分配控制信息
8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
9.其他信息:工作单位,工作区,文件信息等 [1]
//百度百科 -
可以通过exec()函数,将当前子进程的数据替换掉,执行新的功能,即子进程不再为父进程的副本了。
-
往往创建的子进程都要通过exec()函数去实现自己的功能。故,如果fork()出来的子进程都要直接复制所有的资源,这样会浪费时间去复制。
-
通过 COPY ON WRITE ,一开始将子进程的地址空间指向父进程,只有在父进程或子进程进行写入内存时,通过触发异页中断,将异常的页复制一份,使父子进程各种有独立的一份。这样就可以避免,在fork()完直接exec()就可以:
COW技术可减少分配和复制大量资源时带来的瞬间延时。
COW技术可减少不必要的资源分配。比如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制。
Copy On Write技术缺点是什么?
如果在fork()之后,父子进程都还需要继续进行写操作,那么会产生大量的分页错误(页异常中断page-fault),这样就得不偿失。