概述
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
redis正是利用了这个特性,利用fork()来得到一个当前时刻的内存快照,同时创建的这个子进程可以对这个快照进行落盘,而主进程可以继续接受新的写请求,完美实现了数据的一致性同时丝毫不影响主进程的业务。
快照保存过程:
1. redis调用fork,现在有了子进程和父进程。
2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。
3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出(fork一个进程入内在也被复制了,即内存会是原来的两倍)。
最后
以上就是瘦瘦鞋垫为你收集整理的linux fork()函数的妙用---redis rdb保存内存快照的全部内容,希望文章能够帮你解决linux fork()函数的妙用---redis rdb保存内存快照所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复