做落盘,为了保证时点性,最有效的方法就是在一瞬间把当前的进程的内存复制一份新的,对这份新的内存进行持久化,同时老的内存可以继续接收客户端的命令。这个想法本身思路是对的,但是存在效率和空间占用问题:

那有没有办法可以让这个“内存复制”更快呢?答案是有的,就是利用操作系统fork进程的时候的特性 - “内存一致”来达到

操作系统fork是如何创建进程的(利用操作系统fork子进程拷贝当前内存以及写时复制来做落盘)(1)

同时Linux还利用了写时复制(Copy on Write)技术,在fork子进程的时候并没有立即对内存进行拷贝,仅仅拷贝了一份映射关系,让他们暂时指向同一个内存空间。而当进程对这块内存空间有写操作时,才会真正复制内存,而且是以为单位。

这样我们就做到了:

又因为在持久化过程中,对内存的写操作往往很少,大多数都是不变的,这在使用COW的情况,效率会更加高

,