Linux——父子进程/fork()和COW

  1. 我们都知道父进程可以通过fork()函数创建一个子进程。

  2. 创建出的子进程为父进程的副本,除了Pid 其他都相同;

  3. 实际上,父进程只拷贝了自己的PCB块,但物理内存(包括代码段,数据段和用户堆栈都用的一样的,共享的),只有虚拟空间不同。

  4. PCB一般包括:
    1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字
    2.特征信息:一般分系统进程、用户进程、或者内核进程等
    3.进程状态:运行、就绪、阻塞,表示进程现的运行情况
    4.优先级:表示获得CPU控制权的优先级大小
    5.通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道
    6.现场保护区:保护阻塞的进程用
    7.资源需求、分配控制信息
    8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
    9.其他信息:工作单位,工作区,文件信息等 [1]
    //百度百科

  5. 可以通过exec()函数,将当前子进程的数据替换掉,执行新的功能,即子进程不再为父进程的副本了。

  6. 往往创建的子进程都要通过exec()函数去实现自己的功能。故,如果fork()出来的子进程都要直接复制所有的资源,这样会浪费时间去复制。

  7. 通过 COPY ON WRITE ,一开始将子进程的地址空间指向父进程,只有在父进程或子进程进行写入内存时,通过触发异页中断,将异常的页复制一份,使父子进程各种有独立的一份。这样就可以避免,在fork()完直接exec()就可以:

COW技术可减少分配和复制大量资源时带来的瞬间延时。
COW技术可减少不必要的资源分配。比如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制。

Copy On Write技术缺点是什么?
如果在fork()之后,父子进程都还需要继续进行写操作,那么会产生大量的分页错误(页异常中断page-fault),这样就得不偿失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值