并发设计模式之 Copy-on-Write(写时复制)不是延迟模式的写时复制 设计模式

Copy-on-Wirte 经常被称为 COW 或者 CoW 即可以翻译以及理解为 写时复制。

我们知道在多线程编程编程中,或者在多线程运行中, 是有可能由于多线程在操作“共享变量“或者数据而造成线程安全的问题的。在这里举一个栗子:

假如一个线程在读数据,例如 正在读一个对象或一个数组,而在这个时候, 突然有一个线程要过来写这个对象(比如要 更改这个对象里面的某个属性),如果不加措施(如加锁)那么就有可能造成线程安全的问题(读数据的线程可能 读到 写数据线程刚刚写过后的数据,而原先 在写数据前 已经有的数据就会被覆盖掉,这样可能造成读数据线程里的数据不一致)在这里有个可以立刻想到的办法解决这个问题——加锁。 读数据的线程在准备读这个数据时先看看有没有锁 如果没有锁就加锁,如果有锁(比如写数据的线程正在写数据, 已经被写数据的线程加过锁了)则阻塞等待锁被释放,同理,写数据的线程在写数据前也会检查是否有锁 然后有的话阻塞等待。 加锁是一个解决这种安全问题的方法,但是缺点就是串行度太高,并发度太低,如果线程被阻塞,线程就会一直等待着,直到锁被释放,在有些业务场景里面 不太适用(那个将要等待的线程会 急到爆炸)。

第二种办法就是 利用COW模式,在写数据线程将要写数据的时候,将 要写的数据复制一个副本出来(复制副本的过程 是读原先的数据的一个过程)然后写数据线程对这个副本进行写操作,等 数据写好后,再确定接下来的操作(是等数据读完后,合并 原有的数据还是用新副本替换原来的副本)如JUC中的 COWArrayList 就是用新副本替换原来的副本,而在有些 软件程序里, 如 有些数据库里面 当 备份数据的Log的时候(属于读操作),为了可以在备份的时候同时支持写操作(有的概念里面叫Online 操作)会让写数据线程复制一个副本然后开始进行写操作,等读操作和写操作结束以后,再将原先的log和写后的log合并。

上文说的cow的方式以及cow本身 都属于一种思想 具体实现还要看不同的场景。

在操作系统邻域里面 Unix操作系统 中 创建进程的API(系统调用)是fork()函数, 这个函数 会创建一个子进程,同时会复制父进程所有的完整的地址空间即完整的副本(比如父进程占用了1g内存,子进程也就复制1g内存, 这种操作是非常耗时已经消耗存储空间。 在Linux 操作系统 提供的fork函数 创建子进程则是 和父进程共享原先的地址空间, 只用在子进程或者父进程后面的写操作会申请新的空间写入新空间, 从而使子进程和父进程都有了个子的内存地址空间。

cow的使用场景:

不要求强的数据一致性的场景(写数据线程是在复制的数据上面写,不会立刻作用到读数据线程的数据中,所以读数据线程不会立刻get到写数据线程写的数据信息)

读多写少的场景:写太多会复制太多次数据

数据量少的场景:因为复制数据很浪费时间

一个COW的实例:

在rpc框架中:客户端维护的 的路由表可以设置成 ConcurrentHashMap<String(方法名),CopyOnWriteArrayList<Router>(路由信息)> 写线程增删路由信息来改变路由表。在这个例子中是由于一个调用发放可能由多个服务实例提供,所以需要路由表去维护 方法名和ip地址的映射信息。

参考来自:

http://time.geekbang.org/column/article/93154

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写时复制Copy-on-Write,简称COW)策略是一种用于优化内存和间效率的技术,常用于操作系统、数据库以及编程语言的实现中。 在COW策略中,当多个进程或线程共享同一份资源或数据,不会立即复制这份资源或数据,而是共享同一份拷贝,只有在某个进程或线程需要修改这份数据才会执行实际的复制操作。 具体来说,在资源或数据被多个进程或线程共享,它们实际上共享同一份只读的拷贝。当某个进程或线程需要修改这份数据,会先执行一次复制操作,然后修改复制后的数据,而其他进程或线程仍然共享原始的只读拷贝。这样一来,当需要修改的进程或线程比较少,就可以避免大规模的复制操作,从而提高内存和间效率。 COW策略的优点在于减少了复制操作的开销,节省了内存的使用。当多个进程或线程共享大规模数据,COW可以避免大规模的数据复制,减少内存的占用,从而减少了系统开销。同,COW也提高了并发性,因为不需要加锁来保护原始拷贝的数据,只有在修改才需要加锁。 然而,COW策略也存在一些缺点。首先,每次数据修改都需要复制一份数据,而且当修改操作频繁复制操作的开销可能逐渐积累起来,降低了效率。此外,COW策略的实现也较为复杂,需要额外的开销和处理逻辑。 总之,COW策略是一种用于优化内存和间效率的技术,通过延迟实际的数据复制操作,同共享同一份只读数据拷贝,从而提高系统的性能和并发性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值