- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章让 Node.js 变“懒”的 COW 技术由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术.
一般来说复制就是创建出完全相同的两份,两份是独立的:
但是,有的时候复制这件事没多大必要,完全可以复用之前的,这时候可以只是引用之前的那份,在写内容的时候才去复制对应的一部分内容。这样如果内容用于读的话,就免去了复制,而如果需要写,才会真正复制部分内容来做修改.
这就叫做“写时复制”,也就是 Copy-On-Write.
原理很简单,但是在操作系统的内存管理和文件系统中却很常见,Node.js 里面也因为这种技术变“懒”了.
本文我们来探究下 Copy-On-Write 在 Node.js 的进程创建和文件复制的应用:
文件复制这件事最常见的思路就是完全写一份相同的文件内容到另一个位置,但是这样有两个问题:
怎么办呢?这时候操作系统设计者就想到了 COW 技术.
用 COW 技术实现文件复制以后完美解决了上面两个问题:
在 Node.js 的 fs.copyFile 的 api 就可以使用 Copy-On-Write 模式:
默认情况下,copyFile 会写入目标文件,覆盖原内容 。
但是可以通过第三个参数指定复制的策略:
支持的 flag 有 3 个:
这3个常量分别是 1,2,4,可以通过按位或把它们合并之后传入:
Node.js 支持操作系统的 copy-on-write 技术,在一些场景下可以提升性能,建议使用 COPYFILE_FICLONE 的方式,会比默认的方式好一些.
fork 是常见的创建进程的方式,而它的实现就是一种 copy-on-write 技术.
我们知道,进程在内存中分为代码段、数据段、堆栈段这 3 部分:
如果基于该进程创建一个新的进程,那么要复制这 3 部分内存。而如果这三部分内存是一样的内容,那就浪费了内存空间.
所以 fork 并不会真正的复制内存,而是创建一个新的进程,引用父进程的内存,当做数据的修改的时候,才会真正复制该部分的内存.
这也是为什么把进程创建叫做 fork,也就是分叉,因为不完全是独立的,只是某部分做了分叉,成了两份,但是大部分还是一样的.
但如果要执行的代码不一样怎么办呢,这时候就要用 exec 了,它会创建新的代码段、数据段、堆栈段、执行新的代码.
Node.js 里面同样可以用 fork 和 exec 的 api:
fork
exec
fork 是 linux 进程创建的基础,由此可见 copy-on-write 技术多么重要了.
复制同样的内容多份无疑比较浪费空间,所以操作系统在做文件复制、进程创建时的内存复制的时候都采用了 Copy-On-Write 技术,只有真正修改的时候才会去做复制.
Node.js 支持了 fs.copyFile 的 flags 的设置,可以指定 COPYFILE_FICLONE 来使用 Copy-On-Write 的方式做文件复制,也建议大家使用这种方式来节省硬盘空间,提高文件复制的性能.
进程的 fork 也是 Copy-On-Write 的实现,并不会直接复制进程的代码段、数据段、堆栈段到新的内容,而是引用之前的,只有在修改的时候才会做真正的内存复制.
除此以外,Copy-On-Write 在 Immutable 的实现,在分布式的读写分离等领域都有很多应用.
COW 让 Node.js 变“懒”了,但性能却更高了.
原文链接:https://mp.weixin.qq.com/s/nQ6wHZ4H7ULcvN-rwLP-GA 。
最后此篇关于让 Node.js 变“懒”的 COW 技术的文章就讲到这里了,如果你想了解更多关于让 Node.js 变“懒”的 COW 技术的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Haskell 有一个非常膨胀的 undefined 值,它会惰性地引发异常(在求值时)。 Ocaml当然是严格的,所以as far as I can tell there is no equival
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!