有用的Copy-On-write,写时复制

写时复制和写时拷贝是一个意思

写时复制是一种策略,并不是Linux独有的,如果你正在设计某个系统架构,也可以参考这种思想。

写时复制的英文解释如下

Copy-on-write (sometimes referred to as "COW") is an optimization strategy used in computer programming. 

写时复制是计算机的一种优化策略,也可以说是优化机制,是计算机的优化策略并没有错,但是这种策略是人想出来的。

The fundamental idea is that if multiple callers ask for resources which are initially indistinguishable, you can give them pointers to the same resource. 

它的基本思想是,如果有多个调用「callers」,「也可以说是多个进程,多个线程,Linux里面只关心任务就好了」请求同一个难以区分的资源,你可以让他们指向同一个资源指针。

This function can be maintained until a caller tries to modify its "copy" of the resource, at which point a true private copy is created to prevent the changes becoming visible to everyone else.All of this happens transparently to the callers. 

直到有其中一个调用者,试图更改这个两个进程都指向的资源,系统才会分配一个真正的资源「可以认为是物理地址」给这个调用者。这个过程对所有人可见

The primary advantage is that if a caller never makes any modifications, no private copy need ever be created.

如果调用方,也就是拥有相同资源指针的两个进程,都不对资源进行修改,那么就不需要生产一个副本资源。

写时复制的缩写是「COW,奶牛」,但是实际上它跟奶牛没有任何关系。

举个例子说明

假设你是一个酒店老板,马云和任正非在你们酒店订了2020年11月20号的房间,你当时看到酒店还没有住满,所以就给他们下发了一个订购成功的返回值。

如果是程序,在内存充分的情况下,创建进程也就成功了。

然后,你其实不需要马上给马云和任正非安排具体的房间,因为他们俩都还没有到酒店开房。

假设晚上他们过来开房了,你就需要给他们开辟这个房间「也可以认为是资源」,给他们晚上做他们想做的事情。

如果他们一直都不来,那你就不用给他们开房,也就不实际占用你的房间。

fork()函数和写时复制

fork()函数是一个神奇的函数,调用一次,会返回两次,在这个过程中子进程和父进程是共享一个内存空间的。

#include <unistd.h>
#include <stdio.h>int main()
{int pid = fork();if(pid == -1){return (-1);}if(pid > 0){printf("Hi,Father Pid:%d\n",getpid());return (0);} else {printf("Hi,Child Pid:%d\n",getpid());return (0);}
}

-- 程序输出:

weiqifa@bsp-ubuntu1804:~/linux$ gcc -o copy copy-for-write.c 
weiqifa@bsp-ubuntu1804:~/linux$ ./copy
Hi,Father Pid:36320
Hi,Child Pid:36321

-- 然后我加入一个资源

#include <unistd.h>
#include <stdio.h>int main()
{char c = 'a';int pid = fork();if(pid == -1){return (-1);}if(pid > 0){c = 'v';printf("Hi,Father Pid:%d &c:%p c:%c\n",getpid(),&c,c);return (0);} else {printf("Hi,Child  Pid:%d &c:%p c:%c\n",getpid(),&c,c);return (0);}
}

-- 程序输出:

weiqifa@bsp-ubuntu1804:~/linux$ gcc -o copy copy-for-write.c && ./copy
Hi,Father Pid:36518 &c:0x7ffc41acae93 c:v
Hi,Child  Pid:36519 &c:0x7ffc41acae93 c:a

我们可以看到,父进程中我们对资源 c 进行了修改,并打印了资源的地址和值,然后我们在子进程中也打印资源的值。

可以看到,父进程先执行修改 c 的值,并打印 c 的值 是 v

子进程运行,打印 的值,c 的值是 原理的初始化值 a

也就是说这个过程发生了写时复制,在父进程种给 分配了物理内存区别于子进程。

创建进程没有发生写时拷贝的情况

没有发生写时复制的情况

发生了写时复制的情况

推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

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

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

相关文章

lambda应用

def test(a, b, func):result func(a, b)print(result)test(10, 15, lambda x, y: x y) #codingutf-8 #python2需要加上codingutf-8def test(a, b, func):result func(a, b)return result #python2中的方式 #func_new input("请输入一个匿名函数:")#python3中的方…

51单片机学习

单片机学习 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 学习使用单片机就是理解单片机硬件结构&#xff0c;在汇编或C语言中学会各种功能的初始化设置&#xff0c;以及实现各种功能的程序编制。 第一步&#xff1a;数字I/O的使用 使用按钮输入信…

数据库操作,内外联查询,分组查询,嵌套查询,交叉查询,多表查询,语句小结...

为了大家更容易理解我举出的SQL语句&#xff0c;本文假定已经建立了一个学生成绩管理数据库&#xff0c;全文均以学生成绩的管理为例来描述。 1.在查询结果中显示列名&#xff1a; a.用as关键字&#xff1a;select name as 姓名 from students order by age b.直接表示&#x…

雷军:如果程序人生的话,这条路太漫长

这篇文章是在雷总个人博客看到的&#xff0c;里面聊到了他作为程序员的一些经历、初衷以及思考。写的不错&#xff0c;便转来给大家看看。-- 如果程序人生的话&#xff0c;这条路太漫长我并非天生喜欢写程序&#xff0c;上高中时也没有想过程序员的生活。我学电脑非常偶然&…

跨年操作--new Date()

//时间在2017/12/31 17&#xff1a;00 --- 2018/1/1 06:00区间&#xff0c;提示用户无法操作公告。 //time.js (function(){ var date new Date(); //当前年份 var year date.getFullYear(); //当前月份 var month date.getMonth()1; //当前日 var day date.getDate(); //当…

List接口

List接口是collection接口的子接口&#xff0c;对collection进行了简单的扩充&#xff0c;添加了利用索引&#xff08;“位置序”&#xff09;作为参数或者返回类型的方法。List中存放的对象都有一个整数型的型号&#xff0c;记录该对象在容器中的位置&#xff0c;可以根据序号…

51单片机——硬件基础

单片机——硬件基础知识 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、单片机内部资源 STC89C52&#xff1a;8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源 &#xff08;1&#xff09;Flash&#xff08;硬盘&#xff09;——程…

线程静态的几个特点

很多编码规范上都指出不要使用线程静态&#xff08;ThreadStatic&#xff09;&#xff0c;这主要是为了防止在使用的时候出现意外。当有的时候这个线程静态确实会带来一些好处&#xff0c;如何取舍就要看具体情况了。首先&#xff0c;明确一点线程静态与标准静态之间的区别。线…

马上工作了,想问下要注意哪些问题?

这是一位读者在知识星球提问的&#xff0c;涉及的内容很多&#xff0c;但是这些问题&#xff0c;我觉得很多人都需要注意&#xff0c;分享出来让大家看&#xff0c;也希望留言说下自己的看法。1一、 offer情况 1. 已签三方 2. 公司是国内靠前的芯片原厂&#xff0c;深圳&#x…

CSS绘图

1. 自适应的椭圆 背景知识&#xff1a;border-radius属性的基本用法 使用border-radius制作一个圆很简单&#xff0c;只要给任何正方形元素设置固定宽高及一半长度以上的border-radius&#xff0c;就可以得到圆形 1234background: #fb3;width: 200px;height: 200px;border-radi…

JFrame和Frame的区别

在AMT组件中分为两大类&#xff0c;这两类的基类分别是Component和MenuComponent&#xff0c;其中&#xff0c;MenuComponent是所有与菜单相关组件的父类&#xff0c;Component则是除菜单外其他AMT组件的父类&#xff0c;它表示一个能以图形化方式显示出来&#xff0c;并可与用…

51单片机——定时器

单片机——定时器 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、定时器和计数器 时钟周期&#xff1a;单片机时序中的最小单位&#xff0c;集体计算的放法就是时钟源分之一 机器周期&#xff1a;单片机完成一个操作的最短时间&#xff0c;12个时钟…

当年要是这样搞,我的C++也不至于这样!

C一直被称作永不过时的开发语言&#xff0c;比如游戏、服务器、人工智能等领域都必须用到C&#xff01;虽然网上有很多教程和资料&#xff0c;但仍有很多人说C难学&#xff0c;究其原因是没有找到正确的学习方法&#xff01;GoogleTest框架一直广泛应用于C/C项目测试 &#xff…

ABP之创建实体

ABP框架是一个非常庞大的框架&#xff0c;里面的东西有很多&#xff0c;那么如果我需要使用ABP进行项目的开发&#xff0c;具体的使用流程是怎样的呢&#xff1f;接下来将以一个简单的电影票管理“系统”为例子具体的实现一下。 一. 实体的创建 实体是属于领域层的&#xff0c;…

三亚野生植物园

近来朋友外出旅游颇多,大家分享快乐和美景的同时&#xff0c;文字往来也丰富。我的三亚行也该落幕了&#xff0c;休整得差不多了&#xff0c;重整行装&#xff0c;再踏旅途……诸君逍遥游芙蓉叶残桂满岩&#xff0c;粤女梦起游天姥。白塔青湖鸣沙丘&#xff0c;渡海峨眉牵白鹿。…

10张图22段代码,万字长文带你搞懂虚拟内存模型和malloc内部原理

成功是急不来的。不计较眼前得失&#xff0c;将注意力真正着眼于正在做的事情本身&#xff0c;持续付出努力&#xff0c;才能一步步向前迈进&#xff0c;逐渐达到理想的目标。不着急&#xff0c;才能从容不迫&#xff0c;结果自会水到渠成。大家好&#xff0c;我是程序喵&#…

51单片机——中断

单片机——中断 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、中断&#xff1a;放下手中的事情去处理另一种事情。 2、定时器中断 定时器是单片机模块的一个资源&#xff0c;确确实实存在的一个模块&#xff0c;中断是单片机的一种运行机制。不是一…

转!!ftp的主动模式(port)与被动模式(PASV)

转自 http://www.phpweblog.net/killjin/archive/2008/01/06/2653.htmlftp中主动模式(port)与被动模式(PASV)目录 开场白 基础 主动FTP 主动FTP的例子 被动FTP 被动FTP的例子 总结 参考资料 附录 1: 配置常见FTP服务器 开场白 处理防火墙和其他网络连接问题时最常见的…

深入MTK平台bootloader启动分析笔记

bootloader到kernel启动总逻辑流程图ARM架构中&#xff0c;EL0/EL1是必须实现&#xff0c;EL2/EL3是选配&#xff0c;ELx跟层级对应关系&#xff1a;EL0 -- appEL1 -- Linux kernel 、lkEL2 -- hypervisor&#xff08;虚拟化&#xff09;EL3 -- ARM trust firmware 、pre-loade…

VS2005中解决方案管理器中看不到解决方案节点的解决办法

用VS2005有一段时间了&#xff0c;有一个website要转换成webapplication&#xff0c;于是查看了一下website和webapplication的优缺点&#xff0c;决定以后多使用webapplication开发&#xff0c;但发现在使用的时候不能生成解决方案&#xff0c;郁闷啊&#xff0c;比如我新建as…