1、写时复制简介 写时复制(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。 2、用途: 虚拟内存管理中的写时复制一般把这种被共享访问的页面标记为只读。当一个task试图向内存中写入数据时,内存管理单元(MMU)抛出一个异常,内核处理该异常时为该task分配一份物理内存并复制数据到此内存,重新向MMU发出执行该task的写操作。 数据存储中的写时复制Linux等的文件管理系统使用了写时复制策略。 数据库服务器也一般采用了写时复制策略,为用户提供一份snapshot。 软件应用中的写时复制C 标准程序库中的std::string类,在C 98/C 03标准中是允许写时复制策略。但在C 11标准中为了提高并行性取消了这一策略。[1] GCC从版本5开始,std::string不再采用COW策略。 3、写时复制详解 COW是存储系统中使用的基本更新策略之一(还有就地更新(UIP))。基本模式永远不会覆盖旧数据。使用COW策略更新数据块时,数据块被读入内存,进行修改,然后写入新位置,而旧数据则保持不变。由于COW永远不会覆盖旧数据,因此通常用于防止由于本地文件系统中的系统崩溃而导致数据丢失,COW更新策略已在存储系统中广泛使用 但是COW引入了令人不愉快的递归更新过程。文件系统可以看作是由磁盘块组成的大树,当使用COW策略修改叶块时,还需要修改其父节点以更新修改后的子块的新位置。此更新过程将递归进行,直到到达根块为止,该根块可以在磁盘上的固定位置进行更新。我们将这样的过程定义为递归更新。递归更新可能会导致存储系统出现多种副作用,例如WRITE放大,I / O模式变更和性能下降 缺点:
优点:
4、fork和cow cow是一种优化策略,fork是linux提供的创建新线程的方法,大多数的fork实现借用了cow策略来节省内存空间. exec。作为替代,使用了在写时复制技术。这些区域由父、子进程共 享,而且内核将它们的存取许可权改变为只读的。如果有进程试图修改这些区域,则内核为有 fork细节:一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的 调度算法。如果要求父、子进程之间相互同步,则要求某种形式的进程间通信 总结:所以在使用fork在借用cow策略实现时,其实父子进程会共享数据段、代码段、堆,而栈是父子进程独有的. 5、vfork和fork vfork也用于创建一个新进程,而该新进程的目的是调用exec执行一个新程序。但vfork它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用 exec(exit),于 是也就不会存访该地址空间。不过在子进程调用 exec或exit之前,它在父进程的空间中运行。 tip:UIP是将目标块读入内存,进行修改,然后在其原始位置写入磁盘(覆盖旧数据) 引用: https://ieeexplore./abstract/document/6879362/similar#similar 《unix环境高级编程第8章》 来源:https://www./content-4-893551.html |
|