Linux/UNIX写时复制技术

本文介绍了现代Unix及Linux系统中采用的写时复制技术。该技术通过延迟或避免复制数据来提高效率,具体做法是在fork()时不立即复制内存,而是共享父进程的内存空间,仅在写入时触发复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们知道,早期的UNIX在fork()进程时,会将父进程的地址空间完整的复制一份,这个操作非常耗时,通常要进行如下步骤:

  • 为子进程的页表分配页面
  • 为子进程的页分配页面
  • 初始化子进程的页表
  • 把父进程的页复制到子进程对应的页中

而现代的Unix及Linux采用了一种称为写时复制的技术,以达到推迟甚至避免复制数据的目的。

正文

写时复制的做法是,子进程和父进程在fork()时并不马上复制,而是暂时共享内存空间,随后只要父进程或者子进程试图写共享的内存就会产生一个异常, 这时内核才把内存空间进程复制。

如果fork()完子进程后,直接调用exec()执行新程序,这时则根本不会复制父进程的页,而fork()完子进程后,直接调用exec()执行新程序,是一种很常用的做法,这样写时复制就大大提高了效率。
通常fork之后内核会通过将子进程放在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。

调用exec()执行新程序后,子进程的代码段,全局变量区,堆栈段将是全新的,与父进程完全隔离开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值