linux fork()函数的妙用---redis rdb保存内存快照

 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

redis正是利用了这个特性,利用fork()来得到一个当前时刻的内存快照,同时创建的这个子进程可以对这个快照进行落盘,而主进程可以继续接受新的写请求,完美实现了数据的一致性同时丝毫不影响主进程的业务。

快照保存过程:

1. redis调用fork,现在有了子进程和父进程。
2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。
3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出(fork一个进程入内在也被复制了,即内存会是原来的两倍)。

猜你喜欢

转载自blog.csdn.net/weixin_41805011/article/details/81217491