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':
Linux fork()函数底层CopyOnWrite写时复制实现原理剖析相关推荐
- Linux 写时复制机制原理
在 Linux 系统中,调用 fork 系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制 -- 这就是著名 ...
- 有用的Copy-On-write,写时复制
写时复制和写时拷贝是一个意思 写时复制是一种策略,并不是Linux独有的,如果你正在设计某个系统架构,也可以参考这种思想. 写时复制的英文解释如下 Copy-on-write (sometimes r ...
- 写时复制(Copy On Write)
前言 在读<Redis设计与实现>关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操 ...
- 写时复制就这么几行代码,还是不会?
作者 | 闪客 来源 | 低并发编程 这里讲的是 Linux 内核里的写时复制原理. 写时复制的原理网上讲述的文章很多,今天来一篇很直接的文章,通过看看 Linux 0.11 这个最简单的操作系统 ...
- Linux fork的写时复制
这个问题是一个同学在知识星球里面提问的 看下面的代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h& ...
- fork()和写时复制
写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork( )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程.这种行为是非常耗时的,因为它需要: · ...
- 写时复制(Copy-On-Write)思想在Java中的应用
以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://blog.csdn.net/fuzhongmin05/article/details/117076906 ...
- 复制linux内核,linux内核写时复制机制源代码解读
作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...
- linux 进程0 写时复制,linux 写时复制 COW 过程梳理
最后一次谈到缺页,是在一年多以前,http://blog..net/chenyu105/article/details/7061845 那时结个了草率的尾,定格在了handle_pte_fault,留 ...
最新文章
- Caffe Windows版本的编译
- python电脑上怎么下载-python下载文件的三种方法
- java 线程的几种状态
- 炸了,为什么某高速网络总是二层通三层不通?
- 从零开始学Node.js(八_删查)
- 求二叉树节点个数、叶子节点、节点层次与宽度
- 百度网盘php文件怎么打开,如何通过网页版百度网盘下载大文件
- 机器学习 监督学习论文_NeurIPS 2020最佳机器学习论文奖
- 粗看ES6之JSON
- 【java学习之路】(javaWeb【后端】篇)004.Thymeleaf
- oracle in查询 一直等待,学习笔记:Oracle awr 分析解决inactive transaction branch等待事件...
- 2017年mysql考试时间_2017年计算机二级考试时间是哪一天
- 007 JVM堆内存划分
- c语言编程如何进行n次方运算,c语言n次方怎么输入?_后端开发
- 双硬盘安装win10和linux双系统,双硬盘最初尝试完美安装Windows10 + ubuntu16双系统
- centos 安装Htseq_APPNode管理面板安装使用教材
- android盒子共享,Android使用SMB协议共享电脑内文件方法
- 关于同一局域网中,获取的IP非本地真实IP的问题。
- 街霸 隆(Ryu)升龙拳(Syoryuken)动画(四)制作过程中几个版本动画比较一下
- Hyperledger Fabric网络环境手动配置及其链码自动化部署