我们知道了一个进程如何采用请求调页,仅调入包括第一条指令的页面,从而能够很 快开始执行。然而,通过系统调用 fork() 的进程创建最初可以通过使用类似于页面共享的技术,绕过请求调页的需要。这种技术提供了快速的进程创建,并最小化必须分配给新创建进程的新页面的数量。

回想一下,系统调用 fork() 创建了父进程的一个复制,以作为子进程。传统上,fork() 为子进程创建一个父进程地址空间的副本,复制属于父进程的页面。然而,考虑到许多子进程在创建之后立即调用系统调用 exec(),父进程地址空间的复制可能没有必要。

因此,可以采用一种称为写时复制的技术,它通过允许父进程和子进程最初共享相同的页面来工作。这些共享页面标记为写时复制,这意味着如果任何一个进程写入共享页面,那么就创建共享页面的副本。

进程1修改页面C前后

写时复制如图 1 所示,图中分别反映了修改页面 C 的前与后。

例如,假设子进程试图修改包含部分堆栈的页面,并且设置为写时复制。操作系统会创建这个页面的副本,将其映射到子进程的地址空间。然后,子进程会修改复制的页面,而不是属于父进程的页面。显然,当使用写时复制技术时,仅复制任何一进程修改的页面,所有未修改的页面可以由父进程和子进程共享。

还要注意,只有可以修改的页面才需要标记为写时复制。不能修改的页面(包含可执行代码的页面)可以由父进程和子进程共享。写时复制是一种常用技术,为许多操作系统所采用,包括Windows XP、Linux 和 Solaris。

当确定采用写时复制来复制页面时,重要的是注意空闲页面的分配位置。许多操作系统为这类请求提供了一个空闲的页面池。当进程的堆栈或堆要扩展时或有写时复制页面需要管理时,通常分配这些空闲页面。操作系统分配这些页面通常采用称为按需填零的技术。按需填零页面在需要分配之前先填零,因此清除了以前的内容。

UNIX 的多个版本(包括 Solaris 和 Linux)提供了系统调用 fork() 的变种,即 vfork()(虚拟内存fork(virtual memory fork)),vfork() 的操作不同于写时复制的fork()。

采用 vfork(),父进程被挂起,子进程使用父进程的地址空间。因为 vfork() 不采用写时复制,如果子进程修改父地址空间的任何页面,那么这些修改过的页面对于恢复的父进程是可见的。因此,应谨慎使用 vfork(),以确保子进程不会修改父进程的地址空间。当子进程在创建后立即调用 exec() 时,可使用 vfork()。因为没有复制页面,vfork() 是一个非常有效的进程创建方法,有时用于实现 UNIX 命令外壳接口。

写时复制技术(摘自C语言中文网)相关推荐

  1. linux写时复制技术初探

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

  2. 写时拷贝/写时复制技术

    拷贝控制 C++提供两个拷贝控制函数 拷贝构造函数 拷贝赋值运算符重载 例如:String类 class String{public:String(const char* str = NULL);St ...

  3. fork()和写时复制

    写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork(  )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程.这种行为是非常耗时的,因为它需要: · ...

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

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

  5. 复制linux内核,linux内核写时复制机制源代码解读

    作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...

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

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

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

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

  8. redis的rdb持久化的cow技术(写时复制)及fork子进程理解

    2022-01-01 把当前进程数据生成快照(.rdb)文件保存到磁盘的过程 两种触发方式:手动触发(save命令),自动触发(bgsave命令,推荐) save命令:阻塞当前redis直到rdb持久 ...

  9. php zval_copy_static_var(),zval _ 引用计数 _ 变量分离 _ 写时拷贝

    zval.引用计数.变量分离.写时拷贝 我们一步步来理解 1.php语言特性 PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都 ...

最新文章

  1. 佩奇扑街、外星人疯狂!Python 告诉你大年初二应该看哪部电影
  2. 假设你有一个多层感知机网络(MLP),输入层有10个节点、一个单隐层共50个神经元,最后是一个3个神经元的输出层。请问网络的结构是什么样子的使用数学形式进行描述?
  3. HlpViewer.exe 单独打开
  4. 智慧“昆明”在路上 未来充满精彩
  5. acl 服务器编程框架特点介绍
  6. 8 CO配置-控制-一般控制-定义 CO 版本的分类账
  7. [论文阅读][SLAM]Targetless Calibration of LiDAR-IMU System Based on Continuous-time Batch Estimation
  8. python numpy 数组元素周围_Python numpy数组元素属性及访问
  9. ThinkPhp项目部署到Linux file_put_contents() 报错:failed to open stream: Permission denied
  10. 【预测模型】基于贝叶斯优化的LSTM模型实现数据预测matlab源码
  11. 使用nssm注册系统服务的详细方法
  12. javascript继承的几种方式
  13. java转换docx为doc文件_JAVA - 将doc文档转为docx文档
  14. 笔记本计算机被限制无法上网,笔记本无线wifi连接受限制的解决办法
  15. photoshop抠图
  16. 解决 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ not found (required by 问题
  17. 适合学生党无线蓝牙耳机,好用又实惠蓝牙耳机推荐
  18. 索画(金山2022)
  19. Linux内核的配置和编译
  20. 利用canvas画布和rotate()方法让画的图形旋转起来

热门文章

  1. 深度学习_GAN_GAN优化训练方法汇总(全网最全,持续更新)
  2. 开模锻造压力机行业调研报告 - 市场现状分析与发展前景预测
  3. 解决navicat premium连接数据库自动断开问题
  4. 投影问题:带号求解,及中央子午线计算
  5. Alex Net 论文学习笔记(含代码)
  6. 【干货分享】一张图看懂收录与索引的区别
  7. html设计一组图像画廊,基于CSS3的图片画廊的设计与实现
  8. 最美应用+html模板,带你秀的飞起 - 三款 H5 制作应用 - iPhone应用 - 【最美应用】...
  9. 孙悟空的坚定目标 (孙悟空有何深仇大恨大闹天宫)
  10. 附录3 pycoin库、ku程序和tx交易程序