redis fork copy on write

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/...

你可能感兴趣的