写时复制技术
原理:
写时复制是一种计算机程序设计领域的优化策略。
其核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。
这个过程对其他的调用者是透明的(transparently)。
优点:
⭐1、如果调用者没有修改该资源,就不会有副本被建立,因此多个调用者只是读取操作是可以共享同一份资源。
⭐2、写时复制可以减少不必要的资源分配。如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制。
⭐3、当实体有需要对资源进行修改时才真正为实体分配私有资源,减少了分配和复制大量资源带来的延时。
写时复制技术是一种很重要的优化手段,核心是懒惰处理实体资源请求,在多个实体资源之间只是共享资源,起初是并不真正实现资源复制,只有当实体有需要对资源进行修改时才真正为实体分配私有资源。
缺点:
1、写时复制技术虽然可以减少分配和复制大量资源时带来的瞬间延时,但实际上是将这种延时附加到了后续的操作之中。即后续操作时性能会受影响,与虚拟磁盘的置零、延迟置零类似。
应用
1、虚拟内存管理中的写时复制
一般把这种被共享访问的页面标记为只读。当一个task试图向内存中写入数据时,内存管理单元(MMU)抛出一个异常,内核处理该异常时为该task分配一份物理内存并复制数据到此内存,
重新向MMU发出执行该task的写操作。
比如Linux的fork()使用写时拷贝页来实现新进程的创建,它是一种可推迟甚至避免数据拷贝的技术,开始时内核并不会复制整个地址空间,而是让父子进程共享地址空间,只有在写时才复制地址空间,使得父子进程都拥有独立的地址空间,即资源的复制是在只有需要写入时才会发生。在此之前都是以读的方式去和父进程共享资源,这样,在页根本不会被写入的场景下,fork()立即执行exec(),无需对地址空间进行复制,fork()的实际开销就是复制父进程的一个页表和为子进程创建一个进程描述符,也就是说只有当进程空间中各段的内存内容发生变化时,父进程才将其内容复制一份传给子进程,大大提高了效率。
2、数据存储中的写时复制
Linux等的文件管理系统使用了写时复制策略。
举个例子,比如我们有个程序要写文件,不断地根据网络传来的数据写,如果每一次fwrite或是fprintf都要进行一个磁盘的I/O操作的话,都简直就是性能上巨大的损失,
因此通常的做法是,每次写文件操作都写在特定大小的一块内存中(磁盘缓存),只有当我们关闭文件时,才写到磁盘上(这就是为什么如果文件不关闭,所写的东西会丢失的原因)
原文链接:https://www.jb51.net/article/189510.htm