写时拷贝 --全篇来自chatgpt

fork是Unix和类Unix操作系统中用于创建进程的系统调用。fork会创建一个子进程,该子进程几乎是父进程的完全拷贝,包括代码段、数据段、堆和栈。然而,为了提高效率,fork使用了一种叫做写时拷贝(Copy-On-Write, COW)的技术。

写时拷贝(Copy-On-Write, COW)

基本原理

写时拷贝的基本思想是:在创建子进程时,不立即复制父进程的内存空间,而是让父子进程共享同一块物理内存。只有当其中一个进程尝试修改这块内存时,操作系统才会在写入时进行拷贝,为修改的那块内存创建一个新的物理内存页。这种方式节省了内存并提高了性能,特别是在很多情况下,子进程会很快调用exec类函数替换进程镜像,而无需实际修改父进程的内存。

内存方面的详细工作机制
  1. 内存页标记为只读: 当fork系统调用创建子进程时,父进程的内存页会被标记为只读(read-only)。父子进程共享这些只读的内存页。

  2. 页表复制: 父进程的页表(page table)会被复制到子进程中,但是这些页表指向的是相同的物理内存页。因为页表项是只读的,所以两个进程都不能修改这些内存页。

  3. 页故障(Page Fault)处理: 当父进程或子进程尝试写入某个内存页时,会触发页故障(page fault)。操作系统的页故障处理程序会检查这个页是否标记为写时拷贝。

  4. 实际拷贝: 在触发页故障后,操作系统会为该进程分配一个新的物理内存页,并将原来的内容复制到这个新的页中。然后,页表会被更新,指向新的物理内存页,并将这个页标记为可写(writable)。只有在这一时刻,实际的物理内存才会被复制。

  5. 内存保护更新: 新的页表项指向了新分配的物理内存页后,内存保护会被更新,允许对新内存页的写操作。

举个例子

假设有一个进程P,它的内存布局如下:

+-----------+
| 代码段     |  -> 共享且只读
+-----------+
| 数据段     |  -> 写时拷贝
+-----------+
| 堆         |  -> 写时拷贝
+-----------+
| 栈         |  -> 写时拷贝
+-----------+

当进程P调用fork创建子进程C时,初始情况下,父子进程共享所有的物理内存页,并且这些页都被标记为只读。其页表情况如下:

P 页表:
+-----------+       +-----------+
| 代码段     |  -->  | 物理页1    |
+-----------+       +-----------+
| 数据段     |  -->  | 物理页2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理页3    |
+-----------+       +-----------+
| 栈         |  -->  | 物理页4    |
+-----------+       +-----------+C 页表:
+-----------+       +-----------+
| 代码段     |  -->  | 物理页1    |
+-----------+       +-----------+
| 数据段     |  -->  | 物理页2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理页3    |
+-----------+       +-----------+
| 栈         |  -->  | 物理页4    |
+-----------+       +-----------+

当子进程C尝试写入堆时(假设是物理页3),会触发页故障,操作系统执行写时拷贝:

  1. 分配新的物理页(物理页5)。
  2. 将物理页3的内容复制到物理页5。
  3. 更新子进程C的页表,使其堆指向物理页5,并标记为可写。

更新后的页表情况如下:

P 页表:
+-----------+       +-----------+
| 代码段     |  -->  | 物理页1    |
+-----------+       +-----------+
| 数据段     |  -->  | 物理页2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理页3    |
+-----------+       +-----------+
| 栈         |  -->  | 物理页4    |
+-----------+       +-----------+C 页表:
+-----------+       +-----------+
| 代码段     |  -->  | 物理页1    |
+-----------+       +-----------+
| 数据段     |  -->  | 物理页2    |
+-----------+       +-----------+
| 堆         |  -->  | 物理页5    |  -> 新分配的页,可写
+-----------+       +-----------+
| 栈         |  -->  | 物理页4    |
+-----------+       +-----------+

此时,子进程C对堆的修改不会影响到父进程P,确保了两个进程的内存隔离。

优点
  1. 节省内存

    • 使用写时拷贝技术,父进程和子进程在fork后共享相同的内存页,直到需要写入时才进行实际的物理页拷贝。这种方式减少了内存使用,尤其在子进程迅速调用exec系列函数时优势明显。
  2. 提高效率

    • 避免了fork时对所有内存页进行立即拷贝的昂贵操作,提高了进程创建的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业四要素认证接口在金融行业发挥的作用

🎉🎉🎉企业四要素认证接口在金融行业发挥的作用 🌟🌟🌟随着金融科技的飞速发展,越来越多的企业开始关注自身的网络安全和数据保护。在这个背景下,企业四要素认证接口应运而生&#…

hnust 1966: 广度优先搜索

hnust 1966: 广度优先搜索 题目描述 输入一个图,用邻接表存储(实际上也可以选择邻接矩阵),并实现BFS操作。 拷贝前面已经实现的代码,主函数必须如下,完成剩下的部分。 int main() { Graph g; CreateUDG(…

ffmpeg 文档 - 未完

写在前面: 笔记的目录是为了总结他人的话, 从而让自己更专注阅读理解与框架思路整理, 忌大而详细。 原文: ffmpeg 文档 1 概要 ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...ffmpeg 是一个通用的 媒体转换器. 读…

ChatGPT对话:python程序模拟操作网页弹出对话框

【编者按】单击一网页中的按钮,弹出对话框网页,再单击其中的“Yes”按钮,对话框关闭,请求并获取新网页。 可能ChatGPT第一次没有正确理解描述问题的含义,再次说明后,程序编写就正确了。 1问:pyt…

全网最全的接口文档速成

文章目录 接口文档内容前言1. 前后端分离开发1.1 介绍1.2 开发流程1.3 前端技术栈 2. Yapi2.1 介绍2.2 使用2.2.1 准备2.2.2 定义接口2.2.3 导出接口文档2.2.4 导入接口文档 3. Swagger3.1 介绍3.2 使用方式3.3 查看接口文档3.4 常用注解3.4.1 问题说明3.4.2 注解介绍3.4.3 注解…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程,当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

【代码随想录算法训练营第六十三天|卡码网117.软件构造、47.参加科学大会】

文章目录 117.软件构造47.参加科学大会 117.软件构造 本体考察的是拓扑排序的思路,对于所有的有向无环图进行拓扑排序后输出的长度一定是和原结点数相同的。整体思路是找到当前所有的入度为0的结点,添加到结果中,并且查看对应的后续结点将其…

文献笔记|综述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 题目:当大型语言模型遇到优化时 作者:Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 来源:arXiv 单位:华南理工大学 文章目录 When Large Language Model Meets Optimization…

springboot打包异常 Type org.springframework.boot.maven.RepackageMojo not present

解决: 项目在本地时可以正常启动的,但是打包就报错,经过分析得出,应该是打包依赖的问题,解决方法: 在pom文件中的build—>plugins---->plugin中添加spring-boot-maven-plugin依赖的版本号如下: 2.4.3 指定版本号即可。

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知,今年8月1日,CISA新版考纲正式上线,旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版,中文版尚未发布。我们艾威经验丰…

Jetson-AGX-Orin多网卡绑定网卡名

Jetson-AGX-Orin多网卡绑定网卡名 ​ Jetson-AGX-Orin当通过USB接口或者Type-C口插入网卡设备后,重新上电Orin设备后,网卡设备的网卡名与Orin本身的以太网网卡名会发生交换。导致两个网卡设备配置发生错乱,两个网卡都将不通。 可以通过将网…

出道即包揽多项荣誉,Shokz韶音OpenFit Air拿下日本VGP金奖

说到盛夏的日本,你会想到什么?花火大会?但对于消费电子行业来讲,日本每年发布的VGP Summer奖项,才是每年盛夏时节行业内最大的庆典。而在今年的VGP 2024 Summer评选中,Shokz韶音在今年4月份刚发布的开放式耳…

开放式耳机音质哪个品牌的好?盘点几款音质好品牌

在音乐的世界里,每一分贝的振动都承载着情感与故事。对于追求极致音质体验的我们来说,耳机不仅是聆听的工具,更是通往音乐灵魂深处的桥梁。而开放式耳机,以其独有的声学构造和听觉享受,引领我们进入一个更为开阔的音乐…

ChatGPT 5.0:一年后的猜想

对于ChatGPT 5.0在未来一年半后的展望与看法,我们可以从以下几个方面进行详细探讨: 一、技术提升与功能拓展 语言翻译能力: ChatGPT 5.0在语言翻译方面有望实现更大突破。据推测,新版本将利用更先进的自然语言处理技术和深度学习…

ONNX加载模型问题总结

输入参数类型问题 run函数的参数列表如下: SessionImpl::Run(const Ort::RunOptions&, const char* const*, const Ort::Value*, size_t, const char* const*, Ort::Value*, size_t) 注意需要输入输出的参数名字形式是const char* const* 方式1 const char* 数…

vue中,图片在div中按照图片原来大小等比例显示

图片在div中按照图片原来大小等比例显示&#xff0c;可以保证web上显示的图片和实际图片形状一样&#xff0c;保留原始图片效果 实现代码如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

如何探索高效知识管理:FlowUs知识库体验很好

在当今信息爆炸的时代&#xff0c;有效的知识管理对于个人和团队的发展至关重要。FlowUs 知识库作为一款创新的知识管理工具&#xff0c;正逐渐成为众多用户的首选&#xff0c;为他们带来了高效、便捷和有条理的知识管理体验。 FlowUs 知识库的一大特色在于其简洁直观的界面设计…

【ai_agent】从零写一个agent框架(五)基于egui制作一个agent/workflow在线编辑器

前言 上篇我们实现了基础节点&#xff0c;并暴露出grpc服务&#xff0c;但是手动编辑文本制作一个workflow实在强人所难。 所以本文我们做个webui自动生成workflow。 开搞之前先看看别人怎么做的。 Dify 的ui 效果如下图示&#xff1a; 支持多种功能节点 但只能打开一个节…

【spark】Exception in thread “main“ ExitCodeException exitCode=-1073741701

在window上运行spark程序写到本地文件的时候报错。 val rdd sc.sparkContext.parallelize(list)val arr rdd.collect()arr.foreach(println)rdd.saveAsTextFile("test1")sc.close()错误信息: zhangsan lisi wangwu Exception in thread "main" ExitCode…

如何在电子文件上加盖印章

在电子文件上加盖印章&#xff0c;可以通过多种方法实现&#xff0c;主要包括使用专业软件、在线工具以及图片编辑软件等。以下是一些具体步骤和方法&#xff1a; 一、使用专业软件 PDF编辑工具&#xff1a; 启动常用的PDF编辑软件&#xff0c;如Adobe Acrobat、PhantomPDF等…