在 Linux 系统中,调用 fork 系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制 —— 这就是著名的 写时复制 机制。

下面我们将分析 Linux 写时复制(Copy On Write) 机制的原理。

虚拟内存与物理内存

进程的内存可分为 虚拟内存物理内存

  • 物理内存:就是电脑安装的内存条,如果电脑安装了2GB的内存条,那么系统就用于 0 ~ 2GB 的物理内存空间。

  • 虚拟内存:虚拟内存是使用软件虚拟的,在 32 位操作系统中,每个进程都独占 4GB 的虚拟内存空间。

应用程序使用的是 虚拟内存,比如 C 语言取地址操作符号 & 所得到的地址就是 虚拟内存地址。而 虚拟内存地址 需要映射到 物理内存地址 才能使用,如果使用没有映射的 虚拟内存地址,将会导致 缺页异常

虚拟内存地址 映射到 物理内存地址 如下图所示:

如上图所示,进程A与进程B的相同 虚拟内存地址 映射到不同的 物理内存地址,这就是不同进程的相同虚拟内存地址互不影响的原因。

写时复制原理

前面介绍了 虚拟内存物理内存 的概念,接下来将会介绍 Linux 写时复制 的原理。

前面说过,虚拟内存 需要与 物理内存 进行映射才能使用,如果不同进程的 虚拟内存地址 映射到相同的 物理内存地址,那么就实现了共享内存的机制。如下图所示:

由于进程A的 虚拟内存M 与进程B的 虚拟内存M' 映射到相同的 物理内存G,所以当修改进程A 虚拟内存M 的数据时,进程B 虚拟内存M' 的数据也会跟着改变。

Linux 为了加速创建子进程过程与节省内存使用的原因,实现了 写时复制 的机制。

写时复制 的原理大概如下:

  • 创建子进程时,将父进程的 虚拟内存物理内存 映射关系复制到子进程中,并将内存设置为只读(为什么要设置为只读?)。

  • 当子进程或者父进程对内存数据进行修改时,便会触发 写时复制 机制:将原来的内存页复制一份新的,并重新设置其内存映射关系,将父子进程的内存读写权限设置为可读写。

写时复制 过程如下图所示:

从上图可知,当创建子进程时,父子进程指向相同的 物理内存,而不是将父进程所占用的 物理内存 复制一份。这样做的好处有两个:

  • 加速创建子进程的速度。

  • 减少进程对物理内存的使用。

但这个时候只能对内存进行读操作,如果父进程或子进程对内存进行写操作,那么将会触发 缺页异常,而在 缺页异常 处理中会对物理内存进行复制,并且重新映射其内存映射关系。

复制并重新映射到新的物理内存后,父子进程的虚拟内存就映射到不同的物理内存上,这时父子进程都可以对内存进行写操作而互不影响,所以需要把父子进程的内存读写权限设置为可读写。

总结

本篇文章主要介绍了 Linux 写时复制 的原理,写时复制 是 Linux 创建子进程高效的关键所在,而且还能节省对物理内存使用。我们将在下一篇文章中对 写时复制 的实现进行详细的分析。

- END -


看完一键三连在看转发,点赞

是对文章最大的赞赏,极客重生感谢你

推荐阅读

TCP的FIN_WAIT1状态理解|深入理解TCP

深入理解无锁编程

深入理解编程艺术之策略与机制相分离

Linux 写时复制机制原理相关推荐

  1. Linux fork()函数底层CopyOnWrite写时复制实现原理剖析

    创建子进程的速度应该是怎么样的? 如果父进程是redis,内存数据比如说有10G,需要考虑的有两个点: ①速度如何 ②内存空间够不够 在Linux中有个系统调用--fork(): ①速度:快 ②空间: ...

  2. 复制linux内核,linux内核写时复制机制源代码解读

    作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...

  3. Linux-Copy On Write写时复制机制初探

    文章目录 生猛干货 COW概述 *Unix fork 函数族exec( ) 为什么有了COW? COW 原理 COW的优缺点 小结 搞定Linux核心技术 生猛干货 从系统安装到程序员必备的Linux ...

  4. linux 进程0 写时复制,linux 写时复制 COW 过程梳理

    最后一次谈到缺页,是在一年多以前,http://blog..net/chenyu105/article/details/7061845 那时结个了草率的尾,定格在了handle_pte_fault,留 ...

  5. 写时复制,写时拷贝,写时分裂,Copy on write

    2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...

  6. 写时复制就这么几行代码,还是不会?

    ‍ 作者 | 闪客 来源 | 低并发编程 这里讲的是 Linux 内核里的写时复制原理. 写时复制的原理网上讲述的文章很多,今天来一篇很直接的文章,通过看看 Linux 0.11 这个最简单的操作系统 ...

  7. 实战并发编程 - 05等效不可变对象CopyOnWriteArrayList适用场景剖析_写时复制COW

    文章目录 Pre 等效不可变对象 实例变量array就是一个等效不可变对象? 写时复制机制 写时复制的目的 优点 缺点 CopyOnWriteArrayList的使用场景 小结 Pre 本篇文章我们分 ...

  8. Linux fork的写时复制

    这个问题是一个同学在知识星球里面提问的 看下面的代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h& ...

  9. VMWare快照原理(写时复制)?快照保护、快照克隆的作用?

    文章目录 快照原理 快照自动保护 快照与克隆区别 快照原理 数据保护方法有很多种,例如镜像.远程复制.多份拷贝.快照保护等等. 快照是磁盘的一种备份方式,是某一个时间点上某一个磁盘的数据备份,用户可以 ...

最新文章

  1. RSync实现文件备份同步
  2. 2021最大看点AI for Science,在哪些领域有斩获?
  3. 学C++走游戏方向,是不是非常艰难自找苦吃?
  4. 前端开发面试题总结之——JAVASCRIPT(一)
  5. Linux ps命令详解与示例说明
  6. IE6 式样表 Bug
  7. MAC 下SVN 删除文件失败 提示emains in tree-conflict
  8. UVA10369 Arctic Network
  9. export default (imported as router) was not found_HTC 5G Hub 流动Router 评测分享
  10. ESP8266代码分析
  11. 电脑中病毒后被隐藏的文件的显示
  12. JDBC简单连接MySQL
  13. JS 函数中的call,apply
  14. BAT程序员必备技能调研,你中了几招?
  15. python 文本分析教程_Python笔记_第五篇_Python数据分析基础教程_文件的读写
  16. 细等线体cass_CAD中,刚打开一个文件,细等线体显示不出来,然后换个字体后在换回细等线体才正常显示,怎么回事?...
  17. [python]excel试题转为json,并生成
  18. HDU 6194:string string string
  19. 腾讯主机安全“猎刃计划”发布,WebShell挑战赛再燃起,PHPer燥起来
  20. C++进阶——内存管理(三)

热门文章

  1. android scrollview 底部控件,Android ScrollView和屏幕底部的按钮
  2. java的自动装配是什么意思_java – 什么时候在Spring中使用自动装配
  3. postgresql主从备份_PostgreSQL主从流复制与手动主备切换架构
  4. opengl 日地月运动模型_MaskFusion: 多运动目标实时识别、跟踪和重建
  5. 在Linux系统终端利用ggc,大学计算机:Linux下C编程.pdf
  6. 图解JavaScript原型链继承
  7. IIS崩溃时自动抓取Dump
  8. HTTP事务的延迟—TCP的影响
  9. spring mvc+junit
  10. URL(统一资源定位符)