Linux 写时复制机制原理
在 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 写时复制机制原理相关推荐
- Linux fork()函数底层CopyOnWrite写时复制实现原理剖析
创建子进程的速度应该是怎么样的? 如果父进程是redis,内存数据比如说有10G,需要考虑的有两个点: ①速度如何 ②内存空间够不够 在Linux中有个系统调用--fork(): ①速度:快 ②空间: ...
- 复制linux内核,linux内核写时复制机制源代码解读
作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...
- Linux-Copy On Write写时复制机制初探
文章目录 生猛干货 COW概述 *Unix fork 函数族exec( ) 为什么有了COW? COW 原理 COW的优缺点 小结 搞定Linux核心技术 生猛干货 从系统安装到程序员必备的Linux ...
- linux 进程0 写时复制,linux 写时复制 COW 过程梳理
最后一次谈到缺页,是在一年多以前,http://blog..net/chenyu105/article/details/7061845 那时结个了草率的尾,定格在了handle_pte_fault,留 ...
- 写时复制,写时拷贝,写时分裂,Copy on write
2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...
- 写时复制就这么几行代码,还是不会?
作者 | 闪客 来源 | 低并发编程 这里讲的是 Linux 内核里的写时复制原理. 写时复制的原理网上讲述的文章很多,今天来一篇很直接的文章,通过看看 Linux 0.11 这个最简单的操作系统 ...
- 实战并发编程 - 05等效不可变对象CopyOnWriteArrayList适用场景剖析_写时复制COW
文章目录 Pre 等效不可变对象 实例变量array就是一个等效不可变对象? 写时复制机制 写时复制的目的 优点 缺点 CopyOnWriteArrayList的使用场景 小结 Pre 本篇文章我们分 ...
- Linux fork的写时复制
这个问题是一个同学在知识星球里面提问的 看下面的代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h& ...
- VMWare快照原理(写时复制)?快照保护、快照克隆的作用?
文章目录 快照原理 快照自动保护 快照与克隆区别 快照原理 数据保护方法有很多种,例如镜像.远程复制.多份拷贝.快照保护等等. 快照是磁盘的一种备份方式,是某一个时间点上某一个磁盘的数据备份,用户可以 ...
最新文章
- RSync实现文件备份同步
- 2021最大看点AI for Science,在哪些领域有斩获?
- 学C++走游戏方向,是不是非常艰难自找苦吃?
- 前端开发面试题总结之——JAVASCRIPT(一)
- Linux ps命令详解与示例说明
- IE6 式样表 Bug
- MAC 下SVN 删除文件失败 提示emains in tree-conflict
- UVA10369 Arctic Network
- export default (imported as router) was not found_HTC 5G Hub 流动Router 评测分享
- ESP8266代码分析
- 电脑中病毒后被隐藏的文件的显示
- JDBC简单连接MySQL
- JS 函数中的call,apply
- BAT程序员必备技能调研,你中了几招?
- python 文本分析教程_Python笔记_第五篇_Python数据分析基础教程_文件的读写
- 细等线体cass_CAD中,刚打开一个文件,细等线体显示不出来,然后换个字体后在换回细等线体才正常显示,怎么回事?...
- [python]excel试题转为json,并生成
- HDU 6194:string string string
- 腾讯主机安全“猎刃计划”发布,WebShell挑战赛再燃起,PHPer燥起来
- C++进阶——内存管理(三)
热门文章
- android scrollview 底部控件,Android ScrollView和屏幕底部的按钮
- java的自动装配是什么意思_java – 什么时候在Spring中使用自动装配
- postgresql主从备份_PostgreSQL主从流复制与手动主备切换架构
- opengl 日地月运动模型_MaskFusion: 多运动目标实时识别、跟踪和重建
- 在Linux系统终端利用ggc,大学计算机:Linux下C编程.pdf
- 图解JavaScript原型链继承
- IIS崩溃时自动抓取Dump
- HTTP事务的延迟—TCP的影响
- spring mvc+junit
- URL(统一资源定位符)