共计 541 个字符,预计需要花费 2 分钟才能阅读完成。
fork
fork 创立一个子过程,原来过程叫父过程
fork() 调用的一个微妙之处就是它仅仅被调用一次,却可能返回两次,它可能有三种不同的返回值:
- 该过程为父过程时,返回子过程的 pid
- 该过程为子过程时,返回 0
- fork 执行失败,返回 -1
常见模式:
fork 出错可能有 2 种起因:
- 以后的过程数曾经达到了零碎规定的下限
- 零碎内存不足
写时复制
在 fork 之后两个过程 用的是雷同的物理空间 (内存区),子过程的代码段、数据段、堆栈都是指向父过程的物理空间,也就是说,两者的虚拟空间不同,但其对应的 物理空间是同一个。
当父子过程中 有更改相应段的行为产生时 ,再 为子过程相应的段调配物理空间。
实现原理:
fork()之后,kernel 把父过程中所有的内存页的权限都设为 read-only,而后子过程的地址空间指向父过程。当父子过程都只读内存时,相安无事。当其中某个过程写内存时,CPU 硬件检测到内存页是 read-only 的,于是触发页异常中断(page-fault),陷入 kernel 的一个中断例程。中断例程中,kernel 就会 把触发的异样的页复制一份,于是父子过程各自持有独立的一份。
参考
https://blog.csdn.net/qq_3455…
https://zhuanlan.zhihu.com/p/…
正文完