Copy-On-Write

Copy-on-Write是什么 是一种优化技术,主要用于减少不必要的对象复制和内存占用。在这种技术中,当多个线程访问一个共享对象时,只有在写操作发生时才会进行实际的复制,而在读取时,所有线程都共享同一份数据。这种方式通常用于优化性能,特别是在处理大量的读取操作而写操作较少的场景中。 阅读详情

一 概述

Copy-On-Write,顾名思义为写时复制。

二 Copy-On-Write的实现

系统调用fork()系统调用创建进程,linux中的fork()系统调用实现Copy-on-Write写时复制,一般情况下,fork()系统调用会在创建子进程时,会将资源全部复制给子进程,这样效率比较低,而且有些资源对子进程没有用处。所以为了降低创建子进程的成本,Linux优化了fork()函数的实现方式,当父进程创建子进程时,内核只为子进程创建虚拟空间,且父子进程使用的时相同的物理空间,只有父子进程修改时,才会为子进程分配独立的物理空间。

Copy-On-Write:如果由多个调用者同时要求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容,系统才会真正复制一份专用副本给调用者,而其他调用者所见到的最初的资源仍然不变。

三 Copy-On-Write的核心思想及Redis的RDB持久化中应用

Copy-On-Write在处理过程中需要维持一个为读请求使用的指针,并在新数据写入完成后过更新这个指针,以提升读写并发能力,因此,Copy-On-Write也间接提供了读写过程中的原子性,在保持读写过程中的原子性的同时,还保持了一定的读写效率,当Redis需要做持久化时,Redis会fork一个子进程,子进程会将数据保存到磁盘上的一个临时的rdb文件中,当子进程完成临时的rdb的写操作之后会将原来的rdb替换掉,这样的好处就是可以实现copy-on-write,子进程继续接收其他请求,使得Redis的性能比较好,也就是说redis需要做持久化时,redis调用fork创建子进程,此时就存在了子进程与父进程,父进程继续处理client请求,而子进程将内存中的数据写入rdb文件中,由于OS(操作系统)的Copy-on-Write机制的存在,父子进程会共享相同的物理页面,当父进程处理写请求的时候,OS会为要修改的页面创建副本,而不是写共享的页面,所以子进程地址空间内的数据是fork时刻的整个数据库的一个快照,当子进程完成了临时文件的写入之后,用临时文件替换掉原来的快照文件,然后子进程退出,进而完成备份操作。

Redis在启动之后会自动加载已经存在的rdb文件中的数据。

值得注意的是:每次持久化都是将内存中的数据完整的写入磁盘一次,而不是同步增量的数据,当数据量很大写操作(set操作)的时候必然会引起磁盘的I/O操作从而影响性能。且由于快照功能是在一定间隔时间进行一次,可能会因为Redis宕机而丢失从当前至最近一次快照期间的数据,如果Redis不允许丢失任何修改的持久化操作时,就要使用AOF持久化方式。

Iceberg Copy-On-Write Copy-On-Write:顾名思义,就是在写入的时候进行复制,最初是计算机领域用来解决读多写少场景下的并发访问控制问题的如下,在Copy-On-Write模式下,用户写数据时,会先将原始数据Copy出一份副本,此时其他用户读数据时仍然读取的是原始的数据;之后进行写的用户对副本进行修改,修改完成以后,将访问指向的原始数据替换为修改后的数据;替换完成后,用户访问都会访问这个被修改过的数据Copy-On-Write在读多写少的场景下可以提供有效的性能,因为读操作不受影响,可以一直正常访问资源数据。 阅读详情

相关推荐

解释什么是Copy-on-Write(COW) ?

Copy-on-Write(COW)是一种延迟复制的优化策略,多个调用者共享资源直到修改时才复制专用副本。其核心原理包括共享初始资源、写时触发复制和透明性操作,广泛应用于操作系统进程管理(如Linux的fork())、文件系统快照(如ZFS)、并发编程(如Java的CopyOnWriteArrayList)以及数据库版本控制。COW的优势在于提高资源效率和无锁读操作,但存在写操作延迟高和内存占用增加的局限。典型实现包括Linux内存页复制和Java并发容器,适用于读多写少场景,体现了"按需操作&q

weixin_39291964的博客 545

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

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

一个菜鸡的博客 2373

linux那些事之copy on write(COW)

copy on write(COW)特性主要用于在forck时节省内存空间,可以防止在fork时将父进程中的所有数据全局复制一份出来。可以想象如果fork是将所有父进程中的数据全部复制一份给子进程会造成严重副作用: 复制大量不必要的数据会造成占有大量物理内存 fork时造成大量数据会比较耗时操作性能严重损耗。 当一个程序在复制之后调用exec,则会造成更严重性能浪费。意味着fork时复制的数据时完全没有用。内核在解决次问题时,fork并不会复制父进程整个地址空间,也是只复制其page table,则这样

weixin_42730667的博客 2701

Copy-on-Write模式:写时复制

话题:Copy-on-Write模式:不是延时策略的COW 在上一篇文章中我们讲到Java里String这个类在实现replace()方法的时候,并没有更改原字符串里面value[]数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的修改问题时经常用到。如果你深入地思考这个方法,你会发现它本质上是一种Copy-on-Write方法。所谓Copy-on-Write,经常被缩写为COW或者C...

weixin_43719015的博客 5567

嵌入式Linux Qt应用程序卡死问题分析记录

根据应用和系统层面的分析,软件功能异常和卡死现象的原因是系统控制台/dev/console阻塞导致依赖其的相关应用和命令异常。系统控制台/dev/console阻塞的原因还未确定,最近的软件版本和其他测试同事未出现该问题,所以很大可能是串口线的问题,待后续有进展了继续更新。

V10_x的博客 1648

深入解析STM32官方库:.c/.h文件功能与应用场景

本文深入解析了STM32官方库中.c和.h文件的核心功能与应用场景。详细剖析了stm32f10x.h、启动文件、外设驱动文件等关键组件的作用,并通过LED闪烁实战演示了如何构建工程、配置文件和调用库函数。文章旨在帮助开发者理解官方库的架构,掌握高效使用技巧,从而降低STM32开发门槛,提升开发效率与代码质量。

weixin_29189377的博客 356

Copy On Write机制了解一下

前言 在读《Redis设计与实现》关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时复制(copy-on-write)来优化子进程的使用效率,所以在子进程存在期间,服务器会提高负载因子的阈值,从而避免在子进程存在期间进行哈希表扩展操作,避免不必要的内存写入操作,最大限度地节...

u012501054的博客 2万+

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

ESP32S连接JY61P并通过WIFI把姿态数据发送给电脑1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器;2.电脑接受数据是基于python的;

Doudou_Nai的博客 1133

浅析Swift中的Copy-on-Write

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

FIRE-Lee的博客 1945

CPU系统级验证——测试激励——imperas公司riscvOVPsimPlus文件分析

本分析重点关注该repo向量扩展部分。 1. repo简介 该repo是指令集验证的仿真环境包括,大部分是指令集的测试用例,也包含了一些模拟器,如riscvOVPsimPlus。 主要介绍的是riscvOVPsimPlus指令集模拟器,riscvOVPsimPlus(下面统称ISS)是imperas公司在riscvOVPsim基础上扩充了向量扩展的指令集模拟器,该repo于今年9月份部分开源 什么叫部分开源呢? 首先该repo必须在imperas官网注册下载,而且必须是企业用户(免费邮箱人家瞧不上.

知识,既贵,又便宜。 4460

auto.js梦幻西游游戏脚本,梦幻西游脚本开发思路

本篇文章给大家谈谈梦幻西游脚本用什么语言写,以及auto.js梦幻西游游戏脚本,希望对各位有所帮助,不要忘了收藏本站喔。

npy199331的博客 1940

写时复制(Copy On Write)

前言 在读《Redis设计与实现》关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时复制(copy-on-write)来优化子进程的使用效率,所以在子进程存在期间,服务器会提高负载因子的阈值,从而避免在子进程存在期间进行哈希表扩展操作,避免不必要的内存写入操作,最大限度地节...

NeoJoe博客 1万+

SIMULINK开发项目实例 1000 例专栏之第912例--AC-DC整流器场景:基于PWM整流器拓扑结构的建模:三相电压型PWM整流器(SR)单位功率因数控制仿真

本文详细介绍了使用Simulink和Simscape Electrical搭建三相电压型PWM整流器(VSR)模型的方法。主要内容包括:系统结构设计、主电路拓扑搭建、单位功率因数控制算法实现(含PLL锁相环、dq变换、PI控制器等模块)、参数配置和仿真设置。通过仿真分析验证了该系统能实现输入电流与电压同相位、输出直流电压稳定等特性,体现了PWM整流器的高效性和低谐波优势。文章还提出了增强鲁棒性、多工况测试等优化建议,为电力电子系统设计提供了实用指导。该建模方法对新能源发电、电动汽车充电等领域具有重要意义。

xiaoheshang_123的博客 7798

浅谈Swift中的Copy-on-Write

开篇 在Swift中,有两种传值方式:引用类型(Class)和值类型(Struct/Enum)。而值类型有一个copy的操作,它的意思是当你传递一个值类型的变量的时候(给一个变量赋值,或者函数中的参数传值),它会拷贝一份新的值让你进行传递。你会得到拥有相同内容的两个变量,分别指向两块内存。 这样的话,在你频繁操作占用内存比较大的变量的时候就会带来严重的性能问题,Swift也意识到了这个问题,所以推...

weixin_34417814的博客 1392

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 148

Fastgpt本地使用Docker Compose 快速部署

修改文件,并执行再执行d重起容器。具体配置,参考配置详解。可以查看日志,在启动容器后,第一次请求网页,会进行配置文件读取,可以看看有没有读取成功以及有无错误日志。进入 FastGPT 容器,可以通过ls data查看目录下是否成功挂载文件。可通过查看配置文件。可能不生效的原因挂载目录不正确配置文件不正确,日志中会提示invalid json,配置文件需要是标准的 JSON 文件。

洛阳泰山的博客 1634

借shared_ptr实现copy-on-write

借shared_ptr实现copy-on-write场景:一个多线程的C++程序,24h x 5.5d运行。有几个工作线程ThreadW{0,1,2,3},处理客户发过来的交易请求,另外有一个背景线程ThreadB,不定期更新程序内部的参考数据。这些线程都跟一个hash表打交道,工作线程只读,背景线程读写,必然要用到一些同步机制,防止数据损坏。这里的示例代码用std::map代替hash表,意思是

陈硕的Blog 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

redis copy-on-write机制

二. strace工具和redis 的copy-on-write原理 strace : 监控系统内核进程的工具 首先, 讲一个工具strace. Linux的一个进程工具 这个工具的作用是: 用来最终redis的进程 可以参考这个文章: https://www.linuxidc.com/Linux/2018-01/150654.htm 比如,我们要追踪redis启动后的进程 strace -ff -o /usr/local/ooxx/out ./src/redis-server ff: 表示追踪所有的进程和

wejack的专栏 1869

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

copy-on-write 技术

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

AmorHZR的博客 2468

浅谈copy-on-write

写入时复制(Copy-on-write)是一个被使用在程序设计领域的最佳化策略。其基础的观念是,如果有多个呼叫者(callers)同时要求相同资源,他们会共同取得相同的指标指向相同的资源,直到某个呼叫者(caller)尝试修改资源时,系统才会真正复制一个副本(private copy)给该呼叫者,以避免被修改的资源被直接察觉到,这过程对其他的呼叫只都是通透的(transparently)。此作法主要的优点是如果呼叫者并没有修改该资源,就不会有副本(private copy)被建立。--百度百科 简介.

breakout_alex的博客 1542

【C++】c++写时拷贝Copy On Write

c++写时拷贝Copy On Write

SuLiJuan66的专栏 2088

C++:Copy-On-Write技术以及string类的模拟实现

文章目录1. 1.

zw的博客 1116

copy on write

Copy-On-Write的一个定义: 在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指向源对象的位置,并把那块内存的Copy-On-Write位设置为1.在对这个对象执行读操作的时候,内存数据没有变动,直接执行

xuqiyu的专栏 1204

fork()后copy on write的一些特性

Linux上,通过fork()创建一个子进程之后,kernel并不会急于为子进程分配新的内存空间(比如建立页表,拷贝父进程内存空间等)。这是因为,很多时候,子进程会立即调用exec()加载一个新的可执行文件。如果kernel在fork()之后就为子进程复制内存空间,那么子进程调用exec()之后所有的空间又要重新建立,之前的操作全部作废。所以Linux的fork()机制引入了copy on write技术。简单的说就是,fork()之后的子进程和父进程共享同一个地址空间。当父进程或子进程对内存进行修改时,k

赶路人儿 738

JAVA中的copy-on-write容器

实际开发中,对许多数据结构的使用,很多情况下都是读多写少的。在多线程中,读操作并不会改变数据,所以并发读并不会影响线程安全,需要着重考虑的是并发写,所以读操作线程和写操作线程分离会提高多线程效率。 JDK1.5之后出现了copy-on-write原则,即写时复制。其核心思想是,有线程使用容器中的数据时,如果是写入,则复制出一个新容器,修改新容器中的数据后,再将引用指向新容器。如果是读操作则正常读...

白白胖胖充满希望 2328

Copy-On-Write容器

聊聊并发-Java中的Copy-On-Write容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWri

Mr.Yin 514
上一篇: Redis持久化方案之RDB
下一篇: Redis实现集群的原理
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值