copy-on-write

定义

  • copy-on-write是个古老,容易理解且比较高效的策略,可以在数据备份或者读多写少的场景下选择使用
  • 传统方式下,fork()函数在创建子进程时直接把所有资源复制给子进程,即:正文段块,数据段块,堆块,栈块。这种实现方式简单,但是复制的资源可能对子进程毫无用处。linux为了降低创建子进程的成本,改进fork()实现方式使用COW技术创建子进程。当父进程创建子进程时,内核只为子进程创建虚拟空间,父子两个进程使用的是相同的物理空间。只有父子进程发生更改时才会为子进程分配独立的物理空间。

场景

  • 写时复制最擅长的是并发读取场景,即多个线程/进程可以通过对一份相同快照,去处理实效性要求不是很高但是仍然要做的业务(比如实现FS\DB备份、日志、分布式路由)
  • 模型推理,一个模型需要多个进程来提供并发的预测服务,比较大的模型文件只需要加载一次
  • redis的数据持久化、操作系统层面文件系统的写入操作、java的CopyOnWriteArrayList等等

优点

  • Linux通过copy-on-write技术极大地减少了Fork的开销。
  • 文件系统通过copy-on-writee技术一定程度上保证数据的完整性。

缺点

  • 如果在fork之后,父子进程都还需要继续进行写操作,那么会产生大量的分页错误(页异常中断page-fault),反而拉胯性能。
  • 子进程/线程继承父进程数据堆栈导致的【脏数据】问题。

你可能感兴趣的:(copy-on-write)