写时拷贝Copy-On-Write技术
2012-02-13 23:42
169 查看
转自:http://hi.baidu.com/jakisou/blog/item/255e9cd66f16a72a06088b20.html 1、概念 Scott Meyers在《More Effective C++》 中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其 实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书。这就是“拖延战术”,直到 你非要做的时候才去做。 当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变,就成为了最有用的技术,正如C++中的可以随处声明变量的特点一样,Scott Meyers推荐我们,在真正需要一个存储空间时才去声明变量(分配内存),这样会得到程序在运行时最小的内存花销。执行到那才会去做分配内存这种比较耗时的工作,这会给我们的程序在运行时有比较好的性能。必竟,20%的程序运行了80%的时间。 当 然,拖延战术还并不只是这样一种类型,这种技术被我们广泛地应用着,特别是在操作系统当中,当一个程序运行结束时,操作系统并不会急着把其清除出内存,原 因是有可能程序还会马上再运行一次(从磁盘把程序装入到内存是个很慢的过程),而只有当内存不够用了,才会把这些还驻留内存的程序清出。 写时才拷贝(Copy-On-Write)技术,就是编程界“懒惰行为”——拖延战术的产物。举个例子,比如我们有个程序要写文件,不断地根据网络传来的数据写,如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操 作的话,都简直就是性能上巨大的损失,因此通常的做法是,每次写文件操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上 (这就是为什么如果文件不关闭,所写的东西会丢失的原因)。更有甚者是文件关闭时都不写磁盘,而一直等到关机或是内存不够时才写磁盘,Unix就是这样一个系统,如果非正常退出,那么数据就会丢失,文件就会损坏。 呵呵,为了性能我们需要冒这样大的风险,还好我们的程序是不会忙得忘了还有一块数据需要写到磁盘上的,所以这种做法,还是很有必要的。 2、 标准C++类std::string的Copy-On-Write在我们经常使用的STL标准模板库中的string类,也是一个具有写时才拷贝技术的类。C++曾在性能问题上被广泛地质疑和指责过,为了提高性能,STL中的许多类都采用了Copy-On-Write技术。这种偷懒的行为的确使使用STL的程序有着比较高要性能。这里,我想从C++类或是设计模式的角度为各位揭开Copy-On-Write技术在string中实现的面纱,以供各位在用C++进行类库设计时做一点参考。 在讲述这项技术之前,我想简单地说明一下string类内存分配的概念。通过常,string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存。因为是从堆上分配内存,所以string类在维护这块内存上是格外小心的,string类在返回这块内存地址时,只返回const char*,也就是只读的,如果你要写,你只能通过string提供的方法进行数据的改写。 2.1、 特性由表及里,由感性到理性,我们先来看一看string类的Copy-On-Write的表面特征。让我们写下下面的一段程序:
|
相关文章推荐
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)及fork、vfork流程介绍
- 详谈Linux写时拷贝技术(copy-on-write)必看篇
- Linux写时拷贝技术(copy-on-write)
- 【转】Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)--COW
- Linux写时拷贝技术(copy-on-write)
- 写实拷贝技术 copy-on-write
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- Linux写时拷贝技术(copy-on-write)
- copy-on-write(写时拷贝技术)
- (转)Linux写时拷贝技术(copy-on-write)