传统的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对象。同理,只有写入东西时才进行内存的再分配。

写时拷贝技术(copy-on-write)相关推荐

  1. Linux 10分钟让你掌握虚拟地址--写时拷贝技术

    程序地址空间 地址:对内存单元的编号 程序是不占用内存的,运行起来的程序才会被加载到内存,才会占用空间.所以程序地址空间也叫做进程地址空间 我们先来看一下代码: zone.c #include < ...

  2. 写时拷贝技术(COW)

    文章目录 写时拷贝技术 写时拷贝技术原理 举个例子 写时拷贝技术   写时拷贝技术实际上是一种拖延战术,是为了提高效率而产生的技术,这怎么提高效率呢?实际上就是在需要开辟空间时,假装开了空间,实际上用 ...

  3. linux进程--写时拷贝技术copy-on-write(七)

    COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制"技术,也就是只 ...

  4. 写时拷贝(Copy On Write)方案详解

    本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理. 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了  浅拷贝容易出现指针悬挂的问题,深拷贝效率低 ...

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

    COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制"技术,也就是只 ...

  6. 【转】Linux写时拷贝技术(copy-on-write)

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html 源于网上资料 COW技术初窥: 在Linux程序中,fork()会 ...

  7. Linux系统编程15:进程控制之如何创建进程和写时拷贝技术

    文章目录 (1)fork函数回顾 (2)写时拷贝 (1)fork函数回顾 在下面这篇文章我们演示了fork函数以及相关细节 点击跳转 还是借助上文中的程序和效果图片 #include <stdi ...

  8. C++ String类写时拷贝 4

    http://blog.51cto.com/zgw285763054/1839752 维基百科: 写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略.其核心思 ...

  9. 【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 学习 ...

最新文章

  1. Codeforces Round #556 (Div. 2)
  2. 网上找到一个用不同颜色显示表格奇偶行的例子
  3. IntelliJ IDEA绑定Github报Error 403: Not Authorized没有授权问题解决方法
  4. BADI中Filter Dependent和Multiple Use
  5. 计算机专业的大学生自我介绍,计算机专业大学生自我介绍
  6. 第三次学JAVA再学不好就吃翔(part2)--基础语法之注释
  7. js学习总结:DOM节点一(选择器,节点类型)
  8. Python id(obj), ==, is 三者之间的区别
  9. 用 O(1) 时间检测整数 n 是否是 2 的幂次。
  10. 汇编语言的强制类型转换
  11. Android 动态显示和隐藏软键盘
  12. 删除-驱动人生节能省电方案
  13. 【计算机网络学习笔记16】网络新技术
  14. php swfupload,ThinkPHP+swfupload多图上传实例 经典实用的php多图上传
  15. Termux中proot-distro安装备份还原linux发行版笔记
  16. 个人博客或网站快速被搜索引擎收录
  17. eos源码赏析(七):EOS智能合约入门之共识机制初探
  18. 数字谐音记忆编码连连看网页应用
  19. 中国大学MOOC测验爬取(下)
  20. Egress-Assess-出口数据安全功能测试

热门文章

  1. 时钟周期和机器周期之间的关系
  2. linux内核编译选项ccl,Linux下用C语言读取配置文件
  3. python-中文分词词频统计
  4. IP地址归属地查询接口
  5. 基于dlib进行人脸检测
  6. 聊聊AUTOSAR开发的方法论
  7. 计算机二级3月考试标语,2021年第48次全国计算机等级考试-20210715092005.doc-原创力文档...
  8. 各种未解决配置烦心事:
  9. 智慧养猪养殖系统设计
  10. Lombok 带下划线如何转驼峰 java.sql.SQLSyntaxErrorException: Unknown column ‘item_name’ in ‘field list’