写时复制

转载 2012年03月22日 18:41:16

引自:http://www.programlife.net/copy-on-write.html

Copy On Write(写时复制)是在编程中比较常见的一个技术,面试中也会偶尔出现(好像Java中就经常有字符串写时复制的笔试题),今天在看《More Effective C++》的引用计数时就讲到了Copy On Write——写时复制。下面简单介绍下Copy On Write(写时复制),我们假设STL中的string支持写时复制(只是假设,具体未经考证,这里以Mircosoft Visual Studio 6.0为例,如果有兴趣,可以自己翻阅源码)

Copy On Write(写时复制)的原理是什么?
有一定经验的程序员应该都知道Copy On Write(写时复制)使用了“引用计数”,会有一个变量用于保存引用的数量。当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时,这个计数会减一,直到最后一个类析构时,此时的引用计数为1或是0,此时,程序才会真正的Free这块从堆上分配的内存。
引用计数就是string类中写时才拷贝的原理!

什么情况下触发Copy On Write(写时复制)
很显然,当然是在共享同一块内存的类发生内容改变时,才会发生Copy On Write(写时复制)。比如string类的[]、=、+=、+等,还有一些string类中诸如insert、replace、append等成员函数等,包括类的析构时。

代码如下:

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **arg)
{
	string sa = "Copy on write";
	string sb = sa;
	string sc = sb;
	cout<<&sa<<endl;
	printf("sa char buffer address: 0x%08X\n", sa.c_str());
	printf("sb char buffer address: 0x%08X\n", sb.c_str());
	printf("sc char buffer address: 0x%08X\n", sc.c_str());
 
	sc = "Now writing...";
	printf("After writing sc:\n");
	printf("sa char buffer address: 0x%08X\n", sa.c_str());
	printf("sb char buffer address: 0x%08X\n", sb.c_str());
	printf("sc char buffer address: 0x%08X\n", sc.c_str());
 

	return 0;
}

运行结果
sa char buffer address: 0x00380911
sb char buffer address: 0x00380911
sc char buffer address: 0x00380911
After writing sc:
sa char buffer address: 0x00380911
sb char buffer address: 0x00380911
sc char buffer address: 0x00380969
Press any key to continue
可以看到,VC6里面的string是支持写时复制的。

写时复制的核心思想是将需要做的事情推迟到事情即将发生的时刻做,实现“写时复制”的核心方法是“引用计数”,这是实现写时复制的关键。

相关文章推荐

PHP内核探索:引用计数与写时复制

对于PHP这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错。另一方面,除了要安全的申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计...

Linux之写时复制技术

 写入时复制(Copy-on-write)是一个被使用在程式设计领域的最佳化策略。其基础的观念是,如果有多个呼叫者(callers)同时要求相同资源,他们会共同取得相同的指标指向相同的资源,...

C++ 简易string类实现(六)-真正的写时复制

在C++ 简易string类实现(二)-引用计数中,我们引入了写时复制(copy on write),但因为C++编译期无法告诉我们operator[]是被用于读取或写,出于安全,这里假设对non-c...

19 写时复制

第一代Unix系统实现了一种傻瓜式的进程创建:当发出fork()系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要: - 为子进程的页表分配页...

JAVA中写时复制(Copy-On-Write)Map实现

1,什么是写时复制(Copy-On-Write)容器? 写时复制是指:在并发访问的情景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修...

php源码之路第六章第五节 ( 写时复制(Copy On Write))

在开始之前,我们可以先看一段简单的代码:执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储一个1; 再分配一块内存给bar变量,也存一...

linux的写时复制

写时复制机制: 当用户程序调用malloc申请一块内存时,获得的只是对这块虚拟内存的访问权限,内核并没有为其分配相对应的物理页框,然而由于malloc是C库实现的函数,负责在用户空间对申请得到的虚拟...

“Copy-on-write”---->写时复制

linux内核在使用fork创建进程时,基本上会使用Copy-On-Write(COW)技术。这里解释一下COW技术以及为什么在fork中使用。 WIKI上对COW的解释: Copy-on-wri...

Linux进程学习(总结学习关于“写时复制”)

首先是对进程的理解定义: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序...

Copy On Write(写时复制)

维基百科: 写入时复制(Copy-on-write)是一个被使用在程式设计领域的最佳化策略。其基础的观念是,如果有多个呼叫者(callers)同时要求相同资源,他们会共同取得相同的指标指...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写时复制
举报原因:
原因补充:

(最多只允许输入30个字)