首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么是写时复制?

写时复制(Copy-on-Write,简称COW)是一种计算机程序设计领域的优化策略,主要用于提高内存和存储管理的效率。它的核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这个过程对其他的调用者是透明的。以下是写时复制的基本原理和应用场景:

写时复制的基本原理

在Linux系统中,当调用fork系统调用创建子进程时,并不会立即复制父进程的所有内存页,而是与子进程共享相同的内存页。当父进程或子进程对内存页进行修改时,才会触发写时复制机制,将原来的内存页复制一份新的,并重新设置其内存映射关系。

写时复制的应用场景

  • 虚拟内存管理:写时复制用于提高创建新进程的速度和减少内存使用。
  • 文件系统:写时复制用于实现快照功能,允许在线数据备份与恢复。
  • 数据库服务器:写时复制用于提供数据快照,以便在故障发生时能够快速恢复数据。
  • 软件应用:写时复制策略被应用于某些数据结构,如Java中的CopyOnWriteArrayList,以提高并发性能。

写时复制通过延迟资源的复制,直到实际需要修改资源时,从而提高了资源利用率和系统性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 写时复制技术(详解版)

    进程1修改页面C前后 图 1 进程 1 修改页面 C 前后 写时复制如图 1 所示,图中分别反映了修改页面 C 的前与后。 例如,假设子进程试图修改包含部分堆栈的页面,并且设置为写时复制。...然后,子进程会修改复制的页面,而不是属于父进程的页面。显然,当使用写时复制技术时,仅复制任何一进程修改的页面,所有未修改的页面可以由父进程和子进程共享。...写时复制是一种常用技术,为许多操作系统所采用,包括Windows XP、Linux 和 Solaris。 当确定采用写时复制来复制页面时,重要的是注意空闲页面的分配位置。...因为 vfork() 不采用写时复制,如果子进程修改父地址空间的任何页面,那么这些修改过的页面对于恢复的父进程是可见的。因此,应谨慎使用 vfork(),以确保子进程不会修改父进程的地址空间。...当子进程在创建后立即调用 exec() 时,可使用 vfork()。因为没有复制页面,vfork() 是一个非常有效的进程创建方法,有时用于实现 UNIX 命令外壳接口。

    1.7K10

    Linux 写时复制机制原理

    写时复制 机制。...写时复制原理 前面介绍了 虚拟内存 与 物理内存 的概念,接下来将会介绍 Linux 写时复制 的原理。...写时复制 的原理大概如下: 创建子进程时,将父进程的 虚拟内存 与 物理内存 映射关系复制到子进程中,并将内存设置为只读(为什么要设置为只读?)。...当子进程或者父进程对内存数据进行修改时,便会触发 写时复制 机制:将原来的内存页复制一份新的,并重新设置其内存映射关系,将父子进程的内存读写权限设置为可读写。 写时复制 过程如下图所示: ?...总结 本篇文章主要介绍了 Linux 写时复制 的原理,写时复制 是 Linux 创建子进程高效的关键所在,而且还能节省对物理内存使用。我们将在下一篇文章中对 写时复制 的实现进行详细的分析。

    2K31

    Zend_string与写时复制

    h:字符串的哈希值,在字符串被用来当数组的key时才初始化,这样如果同一个字符串被多次用来做key,就不会重复计算了。...val:这里的char[1]并不意味着只存储1位,char[1]被称为柔性数组 字符串的二进制安全 学习过C语言的应该知道,字符串中除了最后一个字符外不允许含有\0,否则会被认为是字符串的结束字符,这就导致了...> 但是PHP不是C语言写的吗?为什么PHP不会报错?我们再来回顾一下zend_string结构体,还记得成员变量len吗?...写时复制: 当b = a 这种操作的时候 a和b是指向同一个zend_val的,内存只有一份,节约了空间,用gc中的refcount+1来标记 我们看代码如下 <?...php $c = "hello world"; echo $c; $a = time()." string"; echo $a; //写时复制 $b = $a; echo $a; echo $b;

    65930

    CopyOnWriteArrayList与Copy On Write写时复制

    前言: 在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,如果每次读取都进行加锁操作,对资源是一种很大的浪费。...CopyOnWrite写时复制。...通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。...ArrayList里添加元素,在添加的时候是需要加锁的,否则多线程写的时候会Copy出N个副本出来。...因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建新对象添加到新容器里

    30250

    并发编程6:CopyOnWriteArrayList 的写时复制

    就好比我和小肉一起写一个项目,每次得等她完全写完要写的,我才能接着写,这效率实在差了点。 好在有 Git,小肉想帮我修改程序员审美 UI 时,可以拷贝一份代码进行修改,修改完后再合并到远程。...Serializable { //... } 它的思想和 Git 有些相似,即使在多个线程中被并发访问, CopyOnWriteArrayList 的读操作(比如 get())也不会阻塞其他操作;写操作则是通过复制一份...CopyOnWriteArrayList 源码分析(Android SDK 25) 从名字就可以看出来 CopyOnWriteArrayList 的特点是 “CopyOnWrite”(写时复制),即在写入新元素时不直接操作原容器...在知乎的一个问题下了解了 Android SDK 的 Java 源码为什么和 JDK 不一致,摘抄如下: Android 使用的Java 库是Apache的Harmony, 与官方Java库接口相同,...) volatile 修饰,保证一致性 写时复制,写完更新引用 有了这两点,我们自己写个 CopyOnWriteHashMap 也是分分钟的事,有兴趣可以自己写一下。

    1.5K80

    简单聊聊copy on write(写时复制)技术

    ​基本介绍概述 写时复制(英语:Copy-on-write,简称COW)是一种计算机领域的优化策略。...其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private...此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy) 被创建,因此多个调用者只是读取操作时可以共享同一份资源。...当需要修改某个共享数据时,先将原始数据复制一份,并在副本上进行修改,修改完成后再将副本的引用赋值给原始数据的引用 ,读写分离,空间换时间,避免为保证并发安全导致的激烈的锁竞争。...,我们也成为“写时复制容器”,类似的容器还有 CopyOnWriteArraySet。

    2.3K40

    JAVA中写时复制Copy-On-Write

    0x01: 什么是写时复制(Copy-On-Write)容器?...写时复制是指:在并发访问的情景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。...因为写操作时,需要复制一个容器,造成内存开销很大,也需要根据实际应用把握初始容器的大小。 不适合于数据的强一致性场合。若要求数据修改之后立即能被读到,则不能用写时复制技术。因为它是最终一致性。...总结:写时复制技术是一种很好的提高并发性的手段。 0x05:为什么会出现Copy-On-Write?...为了应对多线程并发修改这种情况,一种策略就是本文的主题“写时复制”机制;另一种策略是:线程安全的容器类: ArrayList--->CopyOnWriteArrayList HashMap--->ConcurrentHashMap

    57030

    无主复制系统(1)-节点故障时写DB

    单主、多主复制思路都是:客户端向一个主节点发写请求,而DB系统负责将写请求复制到其他副本。主节点决定写顺序,从节点按相同顺序应用主节点发送的写日志。...4.1 节点故障时写DB 假设三副本DB,其中一个副本当前不可用,或许正在重启以安装系统更新。在主节点复制模型下,若要继续处理写,则则需执行故障切换。 无主模型,则不存在这样的切换。...客户端可判断副本3是过期值,然后将新值写入该副本。...若无反熵过程,由于【读修复】只在发生读取时才可能执行修复,那些很少访问的数据有可能在某些副本中已丢失而无法再检测到,从而降低了写的持久性。 ---- Dynamo不适用于Amazon以外的用户。...令人困惑的是,AWS提供了一个名为DynamoDB的托管数据库产品,它使用了完全不同的体系结构:它基于单领导者复制。 ↩︎

    64830

    简单说说写时复制(Copy-on-write)

    最近面试被问到了写时复制(cow)的概念,顺便在这里整理一下,简单说说写时复制的设计理念和使用场景,暂时不会太深入技术实现,技术部分的介绍有机会再去单开一章。...需求和目标 本质上写时复制是一个针对内存资源管理的技术,用以提高内存的使用效率和响应速度。...在这个场景中,写时复制是应用在创建进程副本的阶段,新创建的子进程最初会共享父进程的所有内存,直到两者之一想要修改部分内存页,则这块内存页就会被复制并重新映射给当前的修改进程,以确保修改的内存不会互相影响...在这里应用写时复制主要是有两个方面的考虑: 当子进程选择执行与父进程相同的程序时,内存中有很多数据是可以共享的,部分内存可能整个程序周期中都不会被修改,这部分内存的共享可以提高内存资源的利用率。...根据写时复制的原理可以看到,并不一定是子进程得到复制的内存页,也有可能是父进程。 只有可修改的数据段会用到写时复制,代码段和只读数据段不存在修改的可能。

    2K00

    Linux-Copy On Write写时复制机制初探

    简单来说 COW 写时复制是提高资源使用效率的一种手段, 在内存管理(进程的 fork),数据存储( 比如 Docker 的 AUFS 文件系统),软件开发(Java的Copy On Write容器)、...---- 为什么有了COW? 早期的 Unix 在实现 fork 系统调用时,并没有使用该技术,创建新进程的开销很大。...Linux在使用fork()函数进程创建时,传统fork()的做法是系统把所有的资源复制给新创建的进程,这种方式不仅单一,而且效率低下。因为所拷贝的数据或别的资源可能是可以共享的。...现在Linux的fork()使用写时拷贝页来实现新进程的创建,它是一种可推迟甚至避免数据拷贝的技术,刚开始时内核并不会复制整个地址空间,而是让父子进程共享地址空间,只有在写时才复制地址空间,使得父子进程都拥有独立的地址空间...当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断(page-fault),陷入kernel的一个中断例程。

    3.6K10

    linux内核写时复制机制源代码解读

    写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW缺页异常。...那么究竟COW在linux内核中是如何触发?又是如何处理的呢?我们将在本文中以源代码情景分析的方式来解读神秘的写时COW,从源代码级别的角度彻底理解它。...本文主要会从下面几个方面去分析讨论写时复制: 1.fork子进程时内核为COW做了哪些准备 2.COW进程是如何触发的 3.内核时怎样处理COW这种缺页异常的 4.匿名页的reuse 一,从fork说起...到此就完成了写时复制过程。总结下:分配新的物理页,拷贝原来页的内容到新页,然后修改页表项内容指向新页并修改为可写(vma具备可写属性)。..._mapcount会递减1变为1,也就表面这个页page1被父进程所唯一映射,那么这个时候父进程再去写page1,会发生什么呢?

    4.8K20

    镜像分层原理及容器层写时复制

    对于镜像层的只读文件,容器层如果想做修改,实际上是进行了写时复制操作。(下文介绍)。 二、为什么会产生分层? 通过上文的介绍,我们已经知道镜像是分层的,那么镜像分层的依据是什么?...其中FROM(ADD)指令–添加基础镜像或文件、RUN指令–执行命令行脚本、COPY指令–文件复制,这些都是写操作命令,都会产生新的镜像分层。 三、什么是写时复制?...上文中我们提到了一个概念:写时复制。这个概念如果用专业名词的方式说明还是比较难以理解,所以我用白话的方式说明一下。举个例子: 一个授课老师写了一本练习册(原始镜像)。...这个就是典型的“写时复制”。 对于容器而言,复制出来的文件在面向容器内的运行时软件时,会覆盖原始镜像文件(对于学生而言也只看自己复制出来那份–不要抬杠:抄作业的除外,不看老师的原始文件)。...也就是说发生写时复制之后原始镜像文件被隐藏,容器读写操作都只认复制出来的副本文件。注意:该副本文件存在于容器层,容器重启之后容器层重新建立,上一次容器运行时对于文件的修改全部丢失!

    52210

    PHP5中的写时复制change on write

    php变量在赋值的时候是增加的引用计数,并不是又创建了一块内存空间 但是当新的变量值变更时 , 值从新赋予新的值时 , 就会减掉刚才的引用计数,并且从新创建内存空间....上面的内容是显而易见的,重新赋值自然会重新创建内存空间,但是有一种情况也会发生这样的事 , 那就是在使用到引用符&的时候 , 也会发生复制. 例如下面的代码: <?...xdebug_debug_zval('a','b'); a: (refcount=2, is_ref=1)='shihan' b: (refcount=2, is_ref=1)='shihan' 下面这个$b=&$a会产生复制..., 当进行函数传参时 , 内容占用增大 <?...($d){} test2($b); xdebug_debug_zval('a','b'); var_dump(memory_get_usage());//633128 当没有在函数内部更改这个值的需求时

    74620

    性能优化之写时复制(Copy-on-write:COW)

    写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。...其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private...此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。...在java中的应用举例   java中有两个类:CopyOnWriteArrayList、CopyOnWriteArraySet使用了写时复制技术手段,CopyOnWriteArrayList的实现...Linux使用了一种写时复制技术来使fork操作更高效,主要的原理是将内存复制操作延迟到父进程或子进程向某内存页面写入数据之前,在只读访问的情况下父进程和子进程可以共用同一个内存页。

    1.1K10

    加速LakeHouse ACID Upsert的新写时复制方案

    但当数据量增加时,更新插入的速度有时仍然是一个问题。 在存储表中,使用Apache Parquet作为主要文件格式。...Apache Hudi 支持两种类型的 upsert:写时复制和读时合并。通过写时复制,在更新范围内具有记录的所有文件都将被重写为新文件,然后创建新的快照元数据以包含新文件。...因此写时复制的速度对于许多用例来说至关重要,缓慢的写时复制不仅会导致作业运行时间更长,还会消耗更多的计算资源。在某些用例中我们看到大量的 vCore 被使用,相当于花费了数百万美元。...图 3:Apache Hudi 中传统写时复制与新写时复制的比较 我们演示了新的写时复制过程,并将其与传统过程进行比较。...图 4:Parquet 文件中新的写时复制 基准测试结果 我们进行了基准测试,以使用TPC-DS数据比较我们的快速写时复制方法与传统方法(例如 Delta Lake)的性能。

    18810

    科普:什么是写代码?

    上一篇介绍了码农就是那些从事写代码工作的人,那么什么是写代码?...怎么讲呢,现在已经没有人不知道电脑了,写代码其实是人对电脑的一种服务,目的是让电脑能够好好工作,就好比农民买了一头牛,每天要喂料饮水,还要带它下地耕田、拉车运粮,总之牛虽然有一把力气,干活还必须得有人跟着...码农写代码也是充当这样的角色,工厂生产出来的电脑被搬到各行各业的机房、办公桌上,虽然插着电、号称比人脑快一亿倍,但它们并不能自己工作,还需要有人来为它服务,更具体地说,需要人写出的代码来服务它,具体就是告诉电脑先干什么再干什么...那么代码到底是些什么东西?...食物的多样性和代码的多样性,缘起是一样的,都是因为人类五花八门的需求和欲望。 好了,今天就说这么多,下次我们尝试了解一种写代码的语言:Python.

    2.9K51
    领券