位置: 编程技术 - 正文

详谈Linux写时拷贝技术(copy-on-write)必看篇(linux写时复制)

编辑:rootadmin

推荐整理分享详谈Linux写时拷贝技术(copy-on-write)必看篇(linux写时复制),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux拷贝命令怎么使用,linux 写时拷贝,linux 写时拷贝,linux拷贝文件如何sync吗,linux 写时拷贝技术,linux 0拷贝,linux拷贝文件如何sync吗,linux 0拷贝,内容如对您有帮助,希望把文章链接给更多的朋友!

COW技术初窥

在linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才将父进程的内容复制一份给子进程。

那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢??

在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,其对应的物理空间是一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者都有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。

在网上看到的还有个细节问题是:fork之后内核会将子进程排在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。

COW详述

现在有一个父进程P1,这是一个主体,那么它是有灵魂也是有身体的。现在在其虚拟地址空间(有相应的数据结构表示)上有:正文段,数据段,堆,栈这四个部分,相应地,内核要为这四个部分分配给自的物理块。即正文段块、数据段块、堆块、栈块。至于如何分配,这是内核去做的事,在此不详述。

1. 现在P1用fork()函数为进程创建一个子进程P2

内核:

(1) 复制P1的正文段,数据段,堆,栈这四个部分,注意是其内容相同。

(2) 为这四个部分分配物理块,P2的:正文段(为P1的正文段的物理块,其实就是不为P2分配正文段块,让P2的正文段指向P1的正文段块),数据段(P2自己的数据段块,为其分配对应的块),堆(P2自己的堆块),栈(P2自己的栈块)。如下图所示,同左到右大的方向箭头表示复制内容:

详谈Linux写时拷贝技术(copy-on-write)必看篇(linux写时复制)

2. 写时复制技术

写时复制技术:内核只为新生成的子进程创建虚拟空间结构,它们复制于父进程的虚拟空间结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应的段的行为发生时,再为子进程相应的段分配物理空间。

3. vfork

vfork的做法更加简单粗暴,内核连子进程的虚拟地址空间也不创建了,直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间

总结

传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝将是无用功。

Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间的页的拷贝被推迟到实际发生写入的时候。

在页根本不会被写入的情况下,举例来说,fork()之后立即调用exec(),它们就无需复制了,fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本不会使用的数据(地址空间常常包含数十兆的数据)。由于Unix强调进程快速执行的能力,所以这个优化是很重要的,注:Linux COW和exec没有必然联系

以上这篇详谈Linux写时拷贝技术(copy-on-write)必看篇就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

Linux 中wget命令详细介绍 两个Linux命令wget和exec一个linux命令:wgetftp访问命令来下载文件的三种方式1)

shell脚本实现多彩进度条 先贴代码#!/bin/bashi=0;str=""arr=("|""/""-""\")while[$i-le]doletindex=i%4letindexcolor=i%8letcolor=+indexcolorprintf"e[0;$color;1m[%-s][%d%%]%cr""$str""$i""${arr[$index]}"sleep0.1leti++

Linux C中多线程与volatile变量 LinuxC中多线程与volatile变量volatile修饰的变量表示改变量的值是易变的,编译器不对其进行优化,访问该变量的时候不会从寄存器读取,而是直接从内存

标签: linux写时复制

本文链接地址:https://www.jiuchutong.com/biancheng/378213.html 转载请保留说明!

上一篇:shell如何记录用户的IP与命令详解(shell 记录日志)

下一篇:Linux 中wget命令详细介绍(linux中w命令详解)

  • 企业可否自行决算利润
  • 个体工商户要报工商年报吗?
  • 一般纳税人转小规模最新政策2022
  • 个体户年报纳税额怎么填
  • 季度残保金如何申报
  • 增值税发票价税合计怎么算价款和税费
  • 个税申报的收入是应发工资还是实发工资
  • 回退税款所属期具体条件是
  • 销售煤炭增值税怎么算
  • 房地产公司支付工程款账务处理
  • 房产税房产原值包括地价吗
  • 厂房房产税如何计算
  • 长期股权投资收到红利会计处理
  • 有留抵税额可以享受加计抵减吗
  • 转增股 分红
  • 大病医疗保险为什么贵
  • 未达起征点的个体户个人所得税
  • 现金盘盈盘亏怎么计算
  • 红字增值税专用发票信息表怎么填
  • 1697506445
  • 企业识别码怎么查询
  • 发票跨期审计调查报告
  • 电脑qq音乐声音小怎么回事
  • 收到对方投资款怎么做会计凭证
  • 委托加工代收代缴增值税吗
  • php获取多选框的值
  • 收到汇算清缴退税账务处理
  • php r
  • 微博怎么变成大v
  • 华硕路由器登录地址
  • vue3使用vueup/vue-quill富文本、并限制输入字数
  • 最奢华的女士腕表
  • 详解中国女足出线形势
  • php不能通过浏览器运行吗
  • php怎么加css
  • 入库税款异常怎么处理好
  • 会计制度对企业财务管理的影响
  • 公司一年没有业务
  • kafka gui
  • 科技局创业扶持资金
  • 变更法人代表是重大事项吗
  • 特许经营企业的特点
  • 任意盈余公积金怎么计算
  • 资产负债表怎么看盈利或亏损
  • 免征增值税和增值税免税
  • mysql查询性能分析
  • 预付发票能入账吗
  • 一般纳税人是指哪些人群
  • 被挂靠方并收取管理费的公司怎样处理账务?
  • 贴现法付息实际利率
  • 电脑更换显示器需要重装驱动吗
  • 酒店租金计入什么会计科目
  • 做账财务费用负数
  • 回收材料的好处和问题
  • 小规模纳税人不超过10万免增值税
  • 对公账户分为几类
  • 利息收入和应收利息的区别
  • 外经证预交税款可以以后月份抵扣吗
  • 所得税会计凭证包括哪些
  • 长期待摊费用如何结转
  • mysql的基本操作语句
  • win10预览版21277
  • 提高搜索引擎检索效果的方法
  • centos如何下载
  • win7蓝屏代码0x0000007e
  • 电脑操作系统win8
  • windows 8.1 (multiple editions)
  • 左手linux+gdb,右手unity+vs,一个bit一个bit地去调试是种什么体验
  • 如何正确使用农药芸苔素
  • config_system_switchs
  • javascript简明教程
  • MaterialCheckBox
  • shell输出1到100
  • shell脚本监听端口
  • python excel库哪个好
  • 一般纳税人如何开具3%的发票
  • 已办理了退休,档案还需要保存吗
  • 2021年吉林省城乡居民基础养老金是多少
  • 徐州市哪些区域有疫情
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设