写时拷贝技术(copy-on-write)

2023-11-19

 传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下—举例来说,fork()后立即调用exec()—它们就无需复制了。fork()的实际开销就是复制父进程的页表以及给子进程创建惟一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据)。由于Unix强调进程快速执行的能力,所以这个优化是很重要的。

实际上COW技术不仅仅在Linux进程上有应用,其他例如C++的String在有的IDE环境下也支持COW技术:

编程实例:

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main(int argc, char *argv[])
{
        string str1 = "hello world\n";
	string str2 = str1;

	printf("str1:%x  str2:%x\n", str1.c_str(), str2.c_str());
	str2.clear();
	str2 = "hello\n";
	printf("str1:%x  str2:%x\n", str1.c_str(), str2.c_str());
    return 0;
}
打印结果:

str1:9b59014  str2:9b59014
str1:9b59014  str2:9b5904c

这就说明:str1, str2一开始指向同一内存地址, 当str2内容改变后,则str2的地址发生改变,这有点像设计模式中单例懒惰模式,只有需要对象时才new对象。同理,只有写入东西时才进行内存的再分配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

写时拷贝技术(copy-on-write) 的相关文章

随机推荐

  • String格式问题:将String格式请求方法时,String格式突然转化为对象的问题

    String格式问题 将String格式请求方法时 String格式突然转化为对象的问题 如上图所示 在使用队列调用方法时传递的参数为 xxxxxx 但是在方法中接收到的参数为 id msg xxxxxx name java lang St
  • 【投资界学堂】创业者如何远程管理异地团队

    转自 http pe pedaily cn 201106 20110627214254 all shtml p1 摘要投资界6月27日消息 美国商业网站Under30CEO近日刊载文章 如何成功的远程管理团队 文章选摘了青年创业理事会提供的
  • MQTT通信在JS中的实现

    MQTT协议 Message Queuing Telemetry Transport 消息队列遥测传输是由 IBM 发布的一种基于发布 订阅范式的 轻量级 消息协议 工作于TCP IP协议族之上 它是一种低开销 低带宽占用的即时通讯协议 可
  • 系统架构设计说明书

    目录 修订历史 文档审批信息 1 简介 1 1 目的 1 2 面向读者 1 3 文档组织 1 4 设计限定 1 5 术语说明 1 6 参考文献 2 项目建设目标和预期成果 2 1 建设目标 2 2 主要预期成果 3 系统非功能需求分析 3
  • 网络安全人才缺口超百万,如今的就业情况怎样?

    2022年9月7日 国家网络安全宣传周准时开始 本次网络安全宣传周和以前一样 主要目的都是为了普及网络安全知识 提高网络安全的防护技能 提升对电信网络诈骗的防范意识 在今年的主题论坛上 工信部发布并解读了 2022年网络安全产业人才发展报告
  • 【Vue】笔记四:浅析Vue三种开发模式:MVC、MVP、MVVM

    首先明确一点 开发模式 设计模式 开发模式 一个开发项目的方式或标准 RMVC 比较常见的三种开发模式 MVC MVP MVVM 1 MVC 个人感觉重点在View MVC全名是Model View Controller 是模型 model
  • 析构函数的注意问题以及用new开出来的空间用free释放会怎样

    大学学了越来越多的算法技术 但却不能忽略本源 编程语言是一切的基础 回过头来看依旧存在许多知识漏洞 返濮方能归真 前几天翻看别人的面经 发现了一个很有意思的问题 用new开出来的空间用free释放会怎样 借此机会 复习一下析构函数 并写了一
  • 接口测试理论

    了解接口测试https www cnblogs com houzhizhe p 6825457 html 什么是接口测试 测试人员通常所说的 接口测试 是针对系统各组件之间接口的一种测试 它属于功能测试 接口能测出普通界面操作难以发现的问题
  • 两个页面之间通过url地址栏进行传值

    第一个页面中有两个图片 当点击的时候能在第二个页面中获得它的属性值 通过location assign在第一个页面进行传值 location href在第二个页面进行接受值 一开始不会传值问题 但对于不知道怎么传值的人来说刚开始摸索 觉得好
  • useEffect详情用法

    1 为什么要使用useEffect 想必大家都是用过vue吧 在vue框架所写的项目中 我们通过在与后端进行数据交互的过程中 通常都是会在生命周期中进行数据的请求 然后将数据返回给页面进行渲染 在React中我们也是这样 但是在函数式组件中
  • Ubuntu18.04下SLEUTH 城市扩张模型编译与使用

    SLEUTH是CA模型的一种实现 由美国加州大学克拉克教授开发 可以模拟城市空间增长与土地利用变化 SLEUTH在Cygwin环境下可以运行 但是我尝试了很久都没有成功 于是我就尝试在Ubuntu系统下运行 编译与使用都非常简单 第一步 下
  • python爬虫系列7--动态网页爬取 selenium phantomjs chromedriver

    selenium phantomjs Selenium Selenium可以根据我们的指令 让浏览器自动加载页面 获取需要的数据 甚至页面截屏 或者判断网站上某些动作是否发生 Selenium自己不带浏览器 不支持浏览器的功能 它需要与第三
  • Android WiFi开发教程(二)——WiFi的搜索和连接

    在上一篇中我们介绍了WiFi热点的创建和关闭 如果你还没阅读过 建议先阅读上一篇文章Android WiFi开发教程 一 WiFi热点的创建与关闭 本章节主要继续介绍WiFi的搜索和连接 WiFi的搜索 搜索wifi热点 private v
  • python知识点

    0 1 python 语法基本知识点 注释 单行注释 这是使用三个单引号的多行注释 标识符 第一个字符必须是字母表中字母或下划线 标识符的其他的部分由字母 数字和下划线组成 标识符对大小写敏感 python保留字 False None Tr
  • python 小知识之 - simple http服务

    python3 9 windows 10 dos python一行命令搭建文件系统 cd d E Software python m http server 8090 浏览器访问 http localhost 8090 即可访问 E Sof
  • php知识点滴

    进度条的简单实现 echo ob flush flush 写日志文件 function mylog logthis file put contents myDebugLog log logthis r n FILE APPEND LOCK
  • EI会议——移动互联网、云计算和信息安全国际学术会议

    移动互联网 云计算和信息安全国际学术会议 International Conference on Mobile Internet Cloud Computing and Information Security 火热征稿中 大会官网 htt
  • PostgreSQL实用示例

    PostgreSQL实用示例 参考PostgreSQL 参考pass 创建表 CREATE TABLE bd peak index song feature lib id int8 NOT NULL features l decimal N
  • qpython3ll使用教程_Python3+Flask安装使用教程详解

    一 Flask安装环境配置 当前我的开发环境是Miniconda3 PyCharm 开发环境其实无所谓 自己使用Python3 Nodepad都可以 安装Flask库 pip install Flask 二 第一个Flask应用程序 将以下
  • 写时拷贝技术(copy-on-write)

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