redis fork copy on write

fork

fork建立一個子進程,原來進程叫父進程
fork()調用的一個奇妙之處就是它僅僅被調用一次,卻可以返回兩次,它可能有三種不一樣的返回值:segmentfault

  • 該進程爲父進程時,返回子進程的pid
  • 該進程爲子進程時,返回0
  • fork執行失敗,返回-1

常見模式:
image.pngsession

fork出錯可能有2種緣由:spa

  • 當前的進程數已經達到了系統規定的上限
  • 系統內存不足

寫時複製

在fork以後兩個進程 用的是相同的物理空間(內存區),子進程的代碼段、數據段、堆棧都是指向父進程的物理空間,也就是說,二者的虛擬空間不一樣,但其對應的 物理空間是同一個.net

當父子進程中有更改相應段的行爲發生時,再爲子進程相應的段分配物理空間blog

實現原理:
fork()以後,kernel把父進程中全部的內存頁的權限都設爲read-only,而後子進程的地址空間指向父進程。當父子進程都只讀內存時,相安無事。當其中某個進程寫內存時,CPU硬件檢測到內存頁是read-only的,因而觸發頁異常中斷(page-fault),陷入kernel的一箇中斷例程。中斷例程中,kernel就會 把觸發的異常的頁複製一份,因而父子進程各自持有獨立的一份。進程

參考

https://blog.csdn.net/qq_3455...
https://zhuanlan.zhihu.com/p/...內存

相關文章
相關標籤/搜索