性能优化之写时复制(copy-on-write:cow)

Dreamerwho Dreamerwho     2022-12-01     719

关键词:

写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。

在java中的应用举例

 

java中有两个类:CopyOnWriteArrayList、CopyOnWriteArraySet使用了写时复制技术手段,CopyOnWriteArrayList的实现:

A thread-safe variant of java.util.ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.

在多线程环境,凡是读操作都没有进行加锁操作,而写操作都会在锁的保护下复制一份数据,在复制的数据上做修改,修改完后,再把底层数组的引用指向修改后的新数组。

复制数据意味着需要浪费内存空间,所以在读

写少的并发场景下比较合适。

 /**
     * The lock protecting all mutators.  (We have a mild preference
     * for builtin monitors over ReentrantLock when either will do.)
     */
    final transient Object lock = new Object();

    /** The array, accessed only via getArray/setArray. */
    private transient volatile Object[] array;

所有的修改操作都会使用lock对象内置的锁得以并发安全修改。Object[] array用volatile修饰,保证内存可见性就可以。

 

Linux系统创建新进程

 

unix操作系统中有两种创建新进程的几种,分别是fork和exec。

(1)fork可以创建当前进程的一个副本,父进程和子进程只有PID不同。在该系统调用执行之后,系统中有两个进程,都执行同样的操作。父进程内存的内容将被复制,至少从程序的角度来看是这样。Linux使用了一种写时复制技术来使fork操作更高效,主要的原理是将内存复制操作延迟到父进程或子进程向某内存页面写入数据之前,在只读访问的情况下父进程和子进程可以共用同一个内存页。

(2)exec将一个新程序加载到当前进程的内存中并执行。旧程序的内存页将刷出,其内容将替换为新的数据。然后执行新程序。

 

当然还有很多使用了写时复制优化性能的地方

 

参考:

https://unix.stackexchange.com/questions/58145/how-does-copy-on-write-in-fork-handle-multiple-fork

https://stackoverflow.com/questions/628938/what-is-copy-on-write

https://wikipedia.hk.wjbk.site/wiki/寫入時複製

http://ifeve.com/java-copy-on-write/

https://hackerboss.com/i-have-seen-the-future-and-it-is-copy-on-write/

https://hackerboss.com/copy-on-write-101-part-1-what-is-it/

深入Linux内核架构.pdf

java中写时复制(copy-on-write)map实现(代码片段)

什么是写时复制(Copy-On-Write)容器?写时复制是指:在并发访问的情景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副... 查看详情

linux源码解析10–缺页异常之写时复制(代码片段)

接上篇https://www.daodaodao123.com/?p=776本篇解析缺页异常分支之一,写时复制缺页异常;1.写时复制缺页异常触发条件(1)pte页表项的PRESENT置位(2)pte表项为不为空(3)vma可写,pte只读,进行写操作2.应用场景(1)进程fork子进程的时候,为了... 查看详情

并发容器之写时拷贝的list和set

...生读写操作的类型来说,频繁的加锁和释放锁必然是影响性能的,基于此,jdk中为我们集成了很多适用于不同并发场景下的优秀容器类, 查看详情

死磕java基础—谈谈那个写时拷贝技术(copy-on-write)(代码片段)

...好,我是大明哥。个人网站:https://www.cmsblogs.com/copy-on-write,即写时复制技术,这是小编在学习Redis持久化时看到的一个概念,当然在这个概念很早就碰到过(Java容器并发有这个概念),但是一直都... 查看详情

死磕java基础—谈谈那个写时拷贝技术(copy-on-write)(代码片段)

...好,我是大明哥。个人网站:https://www.cmsblogs.com/copy-on-write,即写时复制技术,这是小编在学习Redis持久化时看到的一个概念,当然在这个概念很早就碰到过(Java容器并发有这个概念),但是一直都... 查看详情

利用“写时复制”将数据复制到 Multiprocessing.Pool() 工作进程

...到Multiprocessing.Pool()工作进程【英文标题】:Leveraging"Copy-on-Write"toCopyDatatoMultiprocessing.Pool()WorkerProcesses【发布时间】:2016-10-3106:20:53【问题描述】:我有一点multiprocessingPython代码,看起来有点像这样:importtimefrommulti 查看详情

探秘写时拷贝的真相发布啦!

导读写时拷贝(copy-on-write,COW)就是等到修改数据时才真正分配内存空间,这是对程序性能的优化,可以延迟甚至是避免内存拷贝,当然目的就是避免不必要的内存拷贝。什么是写时拷贝其实我们对写时... 查看详情

写时拷贝cow(copy-on-write)

   写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到... 查看详情

docker背后的内核知识

...隔离,且通过了cgroups实施了资源约束,通过写时复制(copy-on-write)机制实现了高效的文件操作。下面将详细介绍一下这三者。 一、写时复制(c 查看详情

qemu使用copy-on-write(cow)磁盘

写时复制(copy-on-write,缩写COW)技术不会对原始的镜像文件做更改,变化的部分写在另外的镜像文件中,这种特性在qemu中只有QCOW格式支持,多个COW文件可以指向同一映像同时测试多个配置,而不会危及基本系统。下面以windows2003... 查看详情

Python写时复制或访问时复制共享内存

】Python写时复制或访问时复制共享内存【英文标题】:Pythoncopy-on-writeorcopy-on-accesssharedmemory【发布时间】:2021-04-0523:29:11【问题描述】:我试图了解进程之间共享内存的工作原理,但我陷入了困境。我正在使用一个非常简单的测... 查看详情

docker存储技术浅析(代码片段)

...s7的基础image,因为基础image大家都一样写时复制CoWCoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。比如基于一个image启动多个Container,如果为每个Container都去分配一个image一样的文件系统,那么... 查看详情

swift5写入时复制copy-on-write

...类型的一个特点是在传递和赋值时进行复制。swift使用了copy-on-write来避免频繁复制带来的额外开销。只有当多个对象指向相同的资源,其中一个对象尝试修改资源内容时,copy才会触发。维基百科描述很清晰苹果关于数组使用copy-... 查看详情

22_copyonwrite容器

【简述】Copy-On-Write简称COW,是一种程序设计中的优化策略。JDK里的COW容器分为两种:CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器即:写时复制的容器。通俗理解就是当我们往一个容器添加元素的时候,不直接网当前容器添加... 查看详情

英文copy是啥意思?

...opyright版权一切;复制权zero-copy零复制;零拷贝;零复印;拷贝copy-on-write写入时复制;写时复制;写时拷贝;技术参考技术A英文copy是什么意思?英文copy翻译成中文意思是:复制;复印;模仿;仿造;临摹;抄写;誊写;效法;仿效。 参... 查看详情

linuxbtrfs文件系统及管理

...xbtrfs文件系统及管理  linux文件系统,具有写时复制COW(copy-on-write),改善ext3文件系统单文件大小限制,并加入其他特性,如可写快照,快照的快照,内建RAID,子卷(subvloume),专注于容错,修复和易于管理,下面一起来看看什么... 查看详情

复制延迟案例-读己之写

许多应用让用户提交一些数据,然后查看提交的内容。如客户DB中的记录或某主题的评论。提交新数据必须发送到主节点,但当用户读数据时,可能从【从节点】读取。这对读密集和偶尔写入的负载很合适。但异步复... 查看详情

c++string的引用计数写时复制的实现《moreeffectivec++》(代码片段)

文章目录1.引用计数2.写时复制3.代理类区别读写操作1.引用计数c++引用计数的可以节省内存,而且同时可以降低构建对象和析构的开销,所谓引用计数简单说来就是对各对象共享一份实体的数据,但是我们需要... 查看详情