copy-on-write,即写时复制技术,这是小编在学习 Redis 持久化时看到的一个概念,当然在这个概念很早就碰到过(Java 容器并发有这个概念),但是一直都没有深入研究过,所以趁着这次机会对这个概念深究下。所以写篇文章记录下。
COW(copy-on-write 的简称),是一种计算机设计领域的优化策略,其核心思想是:如果有多个调用者(callers)同时要求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源(摘自 维基百科)。
Linux 中的 copy-on-write
要理解 Linux 的 COW,必须要清楚两个函数 fork()
、exec()
,其中 exec()
是一组函数的统称,包括 execl()
、execlp()
、execv()
、execle()
、execve()
、execvp()
。
fork()
fork()
是什么?它是 UNIX 操作系统中派生新进程的唯一方法,用于创建子进程,该子进程等同于其父进程的副本,他们具有相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,注意是在执行 exec()
之前。
fork()
函数有一个特点就是,它是 调用一次,返回两次