写时拷贝技术

       写时拷贝的主要思想是在复制原来实体的时候,如果复制后的实体不需要进行改变,那么实际上没必要进行实体内容的拷贝,只需建立一个引用指向原来的实体内存,直接应用原来的实体内容即可,只有当需要对复制后的实体进行修改的时候才进行内容的拷贝。

       写时拷贝技术在很多方面都有应用,典型的有:

  1. C++中的写时拷贝技术
  2. Linux中的写时拷贝技术

一、C++中的写时拷贝技术

       C++中的写时拷贝是通过“引用计数”实现的,在分配空间的时候,多分配4个字节,用来记录有多少个指针指向该内存块,当有新的指针指向该内存块的时候,该“引用计数”加一,当要释放该空间时,“引用计数”减一,当“引用计数”减为0时,释放该空间内存。当某个指针需要改变该内存空间中的值的时候,再为这个指针分配自己的空间(旧的内存空间中“引用计数”减一)。

        对于上述情况就需要注意一点,只有当能够准确捕捉用户是否进行了写操作才可以使用写时拷贝计数。比如C++标准认为当你使用迭代器或[]获取到string的内部地址的时候,string并不知道你将进行读操作还是写操作。这是无法确定的,为此当你获取到内部引用的时候,为了避免不能捕获你的写操作,它在此时废除了写操作。

二、Linux中的写时拷贝技术

       在Linux程序中,fork()会产生一个和父进程相同的进程,但子进程之后多会exec调用,处于效率考虑,Linux也使用了“写时拷贝技术”,也就是只有进程空间的各段内容发生变化时,才会将父进程的内容复制一份给子进程。

       那么就会有这样的疑问:子进程的物理空间没有代码,怎么执行exec系统调用呢?
       在执行fork之后、exec之前,两个进程使用的是相同的物理地址空间,子进程的代码段、数据段、堆栈都是指向父进程的物理地址空间,也就是说,两者的虚拟地址空间不同,但其对应的物理空间是相同的。当父子进程有更改相应段的行为发生时,再为子进程相应的段分配物理空间。

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/87882257