写时复制简介

news2024/12/22 9:03:28

        写时复制技术(Copy on Write)是比较常用的一种技术,它的主要目的是延迟减少以及延迟内存的分配,增加执行效率,只有在真正进行写操作的过程中才会真正分配物理资源。同时,也可以保护数据在系统崩溃时出现的丢失。比如,我们在进行文件修改时,文件系统会首先将待修改数据放到另外一个位置,然后进行操作。

        看下维基百科的定义:

        

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

本文简单介绍其在操作系统以及编程语言中的实际使用情况。

1、Linux操作系统

        在linux系统中,当我们要fork子进程的时侯,就会采用COW的思想。即for一个子进程时侯,并不是直接再重新分配一段物理内存给子进程,而是子进程和父进程共用一段物理内存空间,此时父进程和子进程都是只读内存。若子进程或者父进程要进程写操作,再为其分配新的物理内存。

具体原理是:

        fork()之后,kernel把父进程中所有的内存页的权限都设为read-only,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断(page-fault),陷入kernel的一个中断例程。中断例程中,kernel就会把触发的异常的页复制一份 ,于是父子进程各自持有独立的一份。

        linux另外一个要介绍的是在RCU中的应用。

        RCU,全称时Read-copy-update,是在linux2.6中引入的。当只是读时,不需要加锁;当进行写操作时,会拷贝一份副本,然后在合适的时候会将执行旧数据的指针更新为执行新数据。

        相比于读写锁,RCU最大的变化是进行写操作时,读锁不需要被阻塞。此外,就是其修改对于其他任务来说可能不是立即可见的,有滞后性。因此对于数据具有敏感性,需要实时读到最新的场景,RCU是不合适的。另外,RCU由于需要进行副本拷贝,还要进行删除旧数据等一系列操作,所以其写锁的开销成本较大。因此,RCU在写操作越少的情况,其性能就越好。

2、PHP

        PHP 在管理内存方面有一个机制叫写时复制(COW,Copy On Write),保证了变量间复制值不浪费内存:当一个变量的值复制到另一个变量时,PHP 没有为复制值使用更多的内存,相反,它会更新符号表来说明两个变量拥有相同的内存块,所以当执行下面的代码时并没有创建一个新的数组。只有在对应的引用指向的变量值发生变化时才会申请新空间。

3、Java

        Java中有几种支持CopyOnWrite的容器,CopyOnWriteArrayList和CopyOnWriteArraySet.其主要用于并发的场景,是线程安全的,但性能一般,因为在添加元素时,会复制一个array,并加锁向其加入元素。下面是添加元素的源码:

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        //复制一个新数组
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}

        也就是说,上面的容器还是比较适合读多写少的场景。因为写时复制的过程中会同时占用量份内存,可能会频繁引起Java虚拟机的GC操作。此外,它只能满足最终一致性,并不能保证实时的一致性。相反,Java的读写锁中,读写是完全互斥的,能实现强一致性。

4、Redis的Copy On write

        当我们使用BGSAVE命令进行持久化的时候,充分利用了Linux的写时复制机制。bgsave执行时,redis会fork出一个子进程,子进程和父进程共用一份内存,当只有读时,互不影响。

        如果此时主进程有被修改的数据,则被修改的数据对应的页才会进行复制,随后会被子进程写入到RDB文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1487489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频云平台——搭建SRS5平台支持GB28181视频流的推送

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅…

逆向案例四:360k静态和精灵数据动态AES解密,用js的方法

一、360K 网页链接:https://www.36kr.com/p/2672600261670407 页面中有静态的需要解密的内容,确定html包,确定方法 1.1方法步骤 在下方的搜索中输入decrypt(或者关键字window.initialState ,进入js文件 在AES.decrypt处打上断点&#xff0…

MySQL面试题-事务(答案版)

事务 1、事务与存储引擎的关系 事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。 不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都…

hnust 湖南科技大学 2023 综合实训3(软件工程)课设 完整代码及数据库+报告+uml等图源文件+指导书

hnust 湖南科技大学 2023 综合实训3(软件工程)课设 完整代码及数据库报告uml等图源文件指导书 介绍 老师考核等级为优,系统多次测试,未发现bug 项目前后端分离,前端vue2工程项目,后端springboot&#xff…

知乎语音下载(mediadown)

知乎语音下载(mediadown) 一、介绍 知乎语音下载,能够帮助你下载知乎知学堂课程中的语音和视频。它不能帮你越过会员权限,下载你没权限访问的语音和视频。 二、下载地址 本站下载:知乎语音下载(mediadown) 百度网盘下载:知乎语音下载(mediadown) 三、安装教程 …

创业者的智选:知识付费小程序定制开发服务解析

探索知识付费领域的新时代,选择专业的知识付费小程序定制开发服务,打造个性化、高效的知识传播平台。无论您是企业、机构还是个体创作者,都能助您成功变现知识资产。 知识付费小程序的开发是一个涉及多方面技术的综合性工程。下面提供一些关…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤…

Linux:Kubernetes(k8s)基础理论笔记(1)

我笔记来源的图片以及共享至GitHub,本章纯理论。这是k8s中部分的基础理论 👇 KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf👆 什么是kubernetes kubernetes 是一个开源的,用于管…

二、TensorFlow结构分析(1)

目录 1、TF数据流图 1.1 TensorFlow结构分析 1.2 案例 2、图与TensorBoard 2.1 图结构 2.2 图相关操作 2.2.1 默认图 2.2.2 创建图 2.3 TensorBoard:可视化学习 2.3.1 数据序列化 - events文件 2.3.2 启动TensorBoard 2.4 OP 2.4.1 常见OP 2.4.2 指令…

呵护宝贝的肌肤当然要从小做起啦~

亲子系列~来个防晒衣 防晒还真的挺重要的 尤其是女生,防晒要从小做起哈 这款做的防晒面料,有抗紫外线吊牌 可以放心去穿,质地柔软轻盈又透气 防晒护肤双合一,四个颜色每个都很好看 很适合春夏季,很干净清爽 泳衣…

LeetCode.232. 用栈实现队列

题目 232. 用栈实现队列 分析 先了解一下栈和队列的特点: 栈:先进后出队列:先进先出 想用栈实现队列的特点,就需要使用两个栈。因为两个栈就可以将列表倒序。 假设第一个栈 s1 [1,2,3],第二个栈 s2 [] 。若循环…

外卖点餐多门店商家积分商城小程序开发

开源版的点餐外卖多门店多商家积分商城小程序是一款集合了多种功能于一身的移动应用。以下是该小程序的核心功能概述: 点餐与外卖服务:用户能够轻松浏览不同门店的菜单,根据个人口味和需求挑选菜品、口味和规格,并将其加入购物车…

高通QNX基线编译原理

下面代码以高通智驾平台为例。 1 QNX应用程序编译原理 在高通提供的qnx开发包中,qnx的内核已经由qnx所提供,所以qnx的编译,其实就是大量应用程序的编译,以及最后利用buildfile文件,把内核,库文件以及应用程序打包在一起的过程。 1.1 qnx的工程目录 应用程序的编译,可…

AirPods Pro 2 耳机推送新固件,苹果Find My功能助力产品成长

苹果公司面向 AirPods Pro 2(包括 USB-C 和 Lightning 版本),推出了全新的测试版固件更新,版本号为 6E188,高于 12 月份发布的 6B34 固件。 苹果和往常一样,并没有提供详细的更新日志或者说明&#xff0c…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

MyBatisPlus(SpringBoot版)的分页插件

目录 一、前置工作: 1.整体项目目录结构 2.创建普通javamaven项目。 3.导入依赖,改造成springboot项目 4.配置启动类 5.创建service接口及其实现类 6.创建接口Mapper 7.配置数据源 8.创建数据库表 二、使用MP(mybatisplus)的分页插件 二、使…

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中,流行的联合显着性(JS)检验会产生过于保守的 I 类错误率,因此功效较低。但是,如果在使用 JS 测试高维中介假设时,可以准确控制…

一站式电商数据采集API接口-支持多平台采集-全面提升数据采集效率!

电商数据采集API接口包含:淘宝采集,天猫采集,拼多多采集,同行店采集,蓝海店铺采集,批量整店采集,蓝海监控上新,首销尾销,潜力款选品,上新品采集,高…

RNA-Seq 笔记 [4]

***********************该笔记为初学者笔记,仅供个人参考谨慎搬运代码****************************** samtools 排序压缩和 featureCounts 生成基因计数表 SAM文件和BAM文件 1.SAM格式:是一种通用的比对格式,用来存储reads到参考序列的比…

【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议

1. AVDTP概念 AVDTP即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协议),主要负责 A/V stream的协商、建立及传输程序,还指定了设备之前传输A/V stream的消息格式. AVDTP的传输机制和消息格式是以 RTP为基础的。…