免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19852 | 回复: 11
打印 上一主题 下一主题

何为copy-on-write?用其实现fork的时候有何优势? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-21 08:44 |只看该作者 |倒序浏览
这是【FreeBSD操作系统设计与实现】的习题5.4,原文如下:

5.4 What is copy-on-write? In most UNIX applications, the fork system call is followed almost immediately by an exec system call. Why does this behavior make it particularly attractive to use copy-on-write in implementing fork?

论坛徽章:
0
2 [报告]
发表于 2006-03-21 15:34 |只看该作者
这算什么?测验吗?

简单来说,在复制一个对象时并不是真的在内存中把原来对象的数据复制一份到另外一个地址,而是在新对象的内存映射表中指向同原对象相同的位置,并且把那块内存的 Copy-On-Write 位设为 1。在对这个对象执行读操作的时候,内存数据没有变动,直接执行就可以。在写的时候,才真正将原始对象复制一份到新的地址,修改新对象的内存映射表到这个新的位置,然后往这里写。

这个技术需要跟虚拟内存和分页同时使用,其好处是在复制对象的时候因为并不是真的复制,而只是建了一个“指针”,因而大大提高性能。但这并不是一直成立的,前提是在复制新对象之后,进行的写操作只是在一小部分的内存分页上,大部分分页不会用到或者只是读取。不然会产生大量的分页错误,得不偿失。

但对于 fork 和 exec,这又是另外一回事。因为 fork 之后一般会跟一个 exec,将进程空间完全替换。因此在 fork 上采用 Copy-On-Write,会省去一次不必要的进程空间复制。

论坛徽章:
0
3 [报告]
发表于 2006-03-21 16:30 |只看该作者
原帖由 isjfk 于 2006-3-21 15:34 发表
这算什么?测验吗?

简单来说,在复制一个对象时并不是真的在内存中把原来对象的数据复制一份到另外一个地址,而是在新对象的内存映射表中指向同原对象相同的位置,并且把那块内存的 Copy-On-Write 位设为 1。 ...


呵呵!哪里敢测验大家啊,这只是复习和讨论。

自己一个人看书常常会不求甚解,把书看完一遍之后也没有什么深刻的印象,所以就想到做习题是个不错的方法。【FreeBSD操作系统设计与实现】后面的习题有简单的也有复杂的,有知道确定答案的也有开放讨论型的。我觉得都是不错的讨论题目,所以就拿出来大家一起讨论讨论。有些问题虽然简单,但人一多了总会有人冒出新奇的想法的。一番问答之后,问的人弄明白了,答的人也加深了印象。


[ 本帖最后由 雨丝风片 于 2006-3-21 17:00 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-03-21 17:07 |只看该作者
vfork干脆就不应该用, 那玩意儿太危险了, 想使程序robust一些的话就得避免vfork。 一个最简单的例子: vfork之后的exec倘若失败了会怎么样? 答曰:未定义!

copy on write虽然效率比vfork少那么一丁点儿, 可以忽略。 而且没有上面说的问题。

论坛徽章:
0
5 [报告]
发表于 2006-03-21 17:38 |只看该作者
原帖由 雨丝风片 于 2006-3-21 16:30 发表


呵呵!哪里敢测验大家啊,这只是复习和讨论。

自己一个人看书常常会不求甚解,把书看完一遍之后也没有什么深刻的印象,所以就想到做习题是个不错的方法。【FreeBSD操作系统设计与实现】后面的习题有简单 ...

原来是这样

论坛徽章:
0
6 [报告]
发表于 2006-05-05 18:24 |只看该作者
《Linux内核设计与实现》里面讲过了,知道大体的意思,可是还没有用过

论坛徽章:
0
7 [报告]
发表于 2006-05-09 13:14 |只看该作者
原帖由 albcamus 于 2006-3-21 17:07 发表
vfork干脆就不应该用, 那玩意儿太危险了, 想使程序robust一些的话就得避免vfork。 一个最简单的例子: vfork之后的exec倘若失败了会怎么样? 答曰:未定义!

copy on write虽然效率比vfork少那么一丁点儿,  ...

nod,当年vfork是不得已而为之,没有COW可用。

论坛徽章:
0
8 [报告]
发表于 2006-05-09 13:42 |只看该作者
原帖由 mingyanguo 于 2006-5-9 13:14 发表

nod,当年vfork是不得已而为之,没有COW可用。


4.4BSD把vfork去掉了,后来的*BSD又把它加回来了,说明还是有它的优势的。工具毕竟是工具,程序写得好坏还是在于程序员自己。

论坛徽章:
0
9 [报告]
发表于 2006-05-09 15:24 |只看该作者
原帖由 雨丝风片 于 2006-5-9 13:42 发表


4.4BSD把vfork去掉了,后来的*BSD又把它加回来了,说明还是有它的优势的。工具毕竟是工具,程序写得好坏还是在于程序员自己。

呵呵,我觉得又加上去很大程度上有兼容老代码的目的。不过总是有极端情况适用的,之所以不用是为了偷懒,免掉以后的麻烦

论坛徽章:
0
10 [报告]
发表于 2006-05-09 15:53 |只看该作者
原帖由 mingyanguo 于 2006-5-9 15:24 发表

呵呵,我觉得又加上去很大程度上有兼容老代码的目的。不过总是有极端情况适用的,之所以不用是为了偷懒,免掉以后的麻烦


这年头流行“安全第一”,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP