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': 

 

发布了854 篇原创文章 · 获赞 375 · 访问量 79万+

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/104076571
今日推荐