redis為什么要fork一個進程而不是線程?
Redis有RDB和AOF兩種持久化方式,RDB容易都數(shù)據(jù),AOF由于保存的歷史,會使得文件非常非常大,就得啟用rewrite的功能。所以都會有fork出一個子進程,有子進程將數(shù)據(jù)寫入磁盤。 之前有人說子進程會完全copy父進程的內存,所以必須讓redis留出一半的內存空著才會安全。 其實是不準確的,在進行RDB或者rewrite AOF的時候,redis也會利用Linux' Copy-on-write的思想。
簡單來說就是子進程并不會真正copu父進程的內存數(shù)據(jù),只是在新對象的內存映射表中保存舊數(shù)據(jù)的指針,只有舊數(shù)據(jù)有更改,才會把這部分數(shù)據(jù)copy到新的內存空間吧?
最終就是在寫snapshot期間被修改的頁面的大小。