Linux:COW 写时拷贝技术

本文深入解析Linux的copy-on-write(COW)技术,探讨其如何通过虚拟地址空间独立与物理地址空间共享,实现高效进程创建。重点讲解了COW原理、不拷贝的情况(如exec),并说明了其在避免资源浪费上的应用,以及fork()操作的开销。
摘要由CSDN通过智能技术生成

1. cow 写时拷贝技术的背景

1.1 传统fork()调用

传统的fork()系统调用直接把所有的资源复制给新创建的进程。
包括:虚拟地址空间和物理地址空间

1.2 传统fork()调用的缺点

  1. 过于简单并且效率低下,因为它拷贝的数据也许并不共享
  2. 如果新进程打算立即执行一个新的映像(如调用exec函数),那么所有的拷贝都将浪费,未使用到。

2. cow 写时拷贝:

copy-on-write
是一种计算机程序的优化策略。

Linux使用copy-on-write策略来提高效率。
fork时,只会复制父进程的page table 并为子进程创建一个新的进程描述符,父子进程使用相同的physical page,当其中一个进程对某个physical page进行写操作时,内核会将该页内容复制到一个新的physical page,并将该page分配给进行写操作的进程。

fork的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符

2.1 一句话解释:虚拟地址空间独立(复制),物理地址空间共享,只有写入时才拷贝(推迟或者避免拷贝)

  1. 资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。
  2. 写时拷贝是一种可以推迟甚至免除拷贝数据的技术。

2.2 cow 写时拷贝技术原理

内核只为新生成的子进程创建虚拟空间结构(复制于父进程的虚拟地址结构),但是不为这些段分配物理内存,子进程共享父进程的物理空间;
只有当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。

在这里插入图片描述

2.3 cow 写时拷贝的不拷贝的情形:exec

fork()后立即调用exec(执行一个新的进程映像)—它们就无需复制了

2.4 cow 应用场景

在一般情况下,进程创建后都会马上运行一个可执行的文件exec,
这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据)

2.5 fork() 的开销

因此实际上fork()的开销就是复制父进程的页表以及给子进程创建唯一的进程描述符

3. 扩展:多资源共享访问是,读共享,写拷贝

写时拷贝技术是一种很重要的优化手段,核心是懒惰处理实体资源请求,在多个实体资源之间只是共享资源,起初是并不真正实现资源拷贝,只有当实体有需要对资源进行修改时才真正为实体分配私有资源。但写时拷贝技术技术也有它的优点和缺点:
1.写时拷贝技术可以减少分配和复制大量资源时带来的瞬间延时,但实际上是将这种延时附加到了后续的操作之中。
2.写时拷贝技术可以减少不必要的资源分配。比如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制。

参考:
https://blog.csdn.net/frank_jb/article/details/90701410
http://blog.sina.com.cn/s/blog_13b3c939f0102xdtg.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值