Linux fork()函数底层CopyOnWrite写时复制实现原理剖析
創建子進程的速度應該是怎么樣的?
如果父進程是redis,內存數據比如說有10G,需要考慮的有兩個點:
①速度如何
②內存空間夠不夠
在Linux中有個系統調用--fork():
①速度:快
②空間:小
其實玩的就是指針的引用,能達到的效果就是創建速度很快,而且對內存空間要求不大。
計算機中的內存,可以把它理解成一個線性的字節數組byte[],運行的程序默認會認為整個計算機內存都是屬于自己的,創建自己專屬的虛擬地址到計算機真實內存地址的映射。比如程序中定義的一個變量a,會去內存中申請一塊空間,在程序中會有一個虛擬的地址比如3,這個虛擬地址指向計算機的物理內存地址比如8,a存儲的數據比如hello。fork就是拷貝主進程,變量a也會拷貝過去,同時拷貝的子進程中的變量a也會指向真是的物理地址8,其實也就相當于將指針也一起拷貝了,這樣創建子進程會更快,在真實的物理內存中也只會只有一份hello。但此時,父子進程的數據的修改彼此都是不可見的,這是就涉及到另外一個技術:寫時復制CopyOnWrite
寫時復制CopyOnWrite:創建子進程并不發生復制。由于父子進程數據不同步,也不可能子進程將所有數據都修改一遍。實質上玩的是指針,如果要修改變量a的值,肯定在物理內存中必須現有一個新的值,直接將引用指向新的值即可。
這些東西不用死記硬背,直接使用man命令查看fork函數的實現即可知曉其底層實現原理:
man 2 fork;使用/查找'copy':?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Linux fork()函数底层CopyOnWrite写时复制实现原理剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java源码解读--CopyOnWrit
- 下一篇: redis持久化实现原理