定义
- copy-on-write是个古老,容易理解且比较高效的策略,可以在数据备份或者读多写少的场景下选择使用
- 传统方式下,fork()函数在创建子进程时直接把所有资源复制给子进程,即:正文段块,数据段块,堆块,栈块。这种实现方式简单,但是复制的资源可能对子进程毫无用处。linux为了降低创建子进程的成本,改进fork()实现方式使用COW技术创建子进程。当父进程创建子进程时,内核只为子进程创建虚拟空间,父子两个进程使用的是相同的物理空间。只有父子进程发生更改时才会为子进程分配独立的物理空间。
场景
- 写时复制最擅长的是并发读取场景,即多个线程/进程可以通过对一份相同快照,去处理实效性要求不是很高但是仍然要做的业务(比如实现FS\DB备份、日志、分布式路由)
- 模型推理,一个模型需要多个进程来提供并发的预测服务,比较大的模型文件只需要加载一次
- redis的数据持久化、操作系统层面文件系统的写入操作、java的CopyOnWriteArrayList等等
优点
- Linux通过copy-on-write技术极大地减少了Fork的开销。
- 文件系统通过copy-on-writee技术一定程度上保证数据的完整性。
缺点
- 如果在fork之后,父子进程都还需要继续进行写操作,那么会产生大量的分页错误(页异常中断page-fault),反而拉胯性能。
- 子进程/线程继承父进程数据堆栈导致的【脏数据】问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。