有用的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,一经查实,立即删除!

相关文章

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

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

51单片机——硬件基础

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

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

这是一位读者在知识星球提问的&#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…

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…

Android反翻译详解

这段时间在学Android应用开发&#xff0c;在想既然是用Java开发的应该很好反编译从而得到源代码吧&#xff0c;google了一下&#xff0c;确实很简单&#xff0c;以下是我的实践过程。 在此郑重声明&#xff0c;贴出来的目的不是为了去破解人家的软件&#xff0c;完全是一种学习…

51单片机——UART

单片机——UART串口通信 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 对于单片机来说&#xff0c;通信则与传感器、存储芯片、外围控制芯片等技术紧密结合&#xff0c;成为整个单片机系统的“神经中枢”。 1、初步认识 一位一位的发送出去的&#xf…

day 34 守护线程守护进程 互斥锁线程 信号量 生产者消费者

今日内容 1、守护进程vs 守护线程&#xff08;*&#xff09; 2、互斥锁&#xff08;**&#xff09; 3、信号量&#xff08;**&#xff09; 4、生产者消费者模型&#xff08;*****&#xff09; 5、GIL&#xff08;什么时候用进程&#xff0c;什么时候用线程&#xff09;&#xf…

20000W的电灯泡,真的是叼炸天

编排 | strongerHuang素材来源 | 电工电气学习1000W的灯泡有多亮&#xff1f; 20000W的灯泡呢&#xff1f;嵌入式专栏11000W灯泡一位手工帝名叫rctestflight&#xff0c;他认为普通白炽灯泡的能耗是LED灯8倍&#xff0c;他自己要做一盏最亮最亮的灯&#xff0c;就选择了LED灯泡…

以色列:新发明大幅提高太阳能发电效率

央视国际 [url]www.cctv.com[/url]  2007年08月22日太阳能发电是个老话题了&#xff0c;同时也有一个老问题&#xff0c;就是发电效率很低。最近&#xff0c;以色列科学家宣布&#xff0c;他们发明了一种新型的、高效太阳能发电系统&#xff0c;将促进太阳能在工业领域的广泛…

51单片机——I2C总线

单片机——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 UART 属于异步通信&#xff0c;比如电脑发送给单片机&#xff0c;电脑只负责把数据通过TXD 发送出来即可&#xff0c;接收数据是单片机自己的事情。而 I2C 属于同步通信&#xff0c; SCL 时…

物联网开发者被疯抢,华为做了什么?

5G时代到来&#xff0c;物联网技术的应用也离我们越来越近。智慧交通、智能家庭、智慧园区&#xff0c;越来越多的融入到我们的生活当中。所以&#xff0c;对于开发者而言&#xff0c;物联网将是未来发展的一大蓝海领域。但国内物联网人才短缺&#xff0c;每年人才缺口达百万之…

VMware 安装kali——linux

学习信息安全需要安装kali-linux,会遇到许多问题&#xff0c;如下&#xff1a; 1、版本问题 需要注意自己多用软件和电脑操作系统是否是一致版本&#xff0c;有些是可以安装但是不能运行。 2、安装过程选择错误的选项 我们创建新的虚拟机&#xff0c;这时&#xff0c;选择自定…