你知道node为什么会有buffer吗

hebe700

在node中,buffer意思为“缓冲区”,buffer准确说是放在缓冲区里的二进制数据。

这里有一个缓冲区的概念。

缓冲区是内存空间的一部分,在内存空间中预留了一定的存储空间来存放IO输入和输出的数据。计算机之所以要弄一个缓冲区,是为了在IO过程平衡不同IO介质的速度差。

诸如往要写入一段数据到磁盘中,计算机会先将数据写入到内存缓冲区中暂存,要么数据已经写完,要么缓冲区已写满,此时cpu就会把缓冲区的中的数据,一次性写入到磁盘中。

为什么要这样做?假如要写入的一段数据,一共有10个数据块。同时假设,cpu把数据写入到内存缓冲区是1秒,而把数据写入到磁盘中是10秒。

那么,按照缓冲区的机制,十块数据写到内存缓冲区中一共要10秒,然后cpu把内存缓冲区的中数据写入磁盘花费10秒,那么这一段数据最终写入到存储介质中,一共花了20秒。而如果没有内存缓冲区,每一块数据都由CPU直接写入到磁盘的话,每一次写入时是10秒,那么十块数据共十次写入磁盘,那么这段数据写入存储介质中一共花费了100秒。这样的区别是显而易见的,花费100秒就完全拖慢了cpu让它不能去干别的事情了。

从本质上讲,这是因为这一段数据(比方说是一个文件),它不可能被cpu一次就把整个文件的数据读出来,如果这样可以的话,那么一次读取出来了整个文件数据,然后直接只一次写入到磁盘,那这样只有10秒,这当然好,但这样一步登天的事情是不可能的,cpu是不可能一次取出整个文件数据的,它肯定是要一点一点去读,也要一点一点去写,它总得有一个过程。

缓冲区是与IO直接关联的,正是因为有网络IO,磁盘IO,才有缓冲区的存在。

在过去的js中,js是为浏览器而生的,在浏览器中,js本身是没有IO操作的,js发什么ajax请求、选择文件上传,看起来js有IO操作,实际上这都是由浏览器自身底层代码在操作系统上实现,js本身是没有IO的,因为没有IO所以过去的js也没有二进制数据的表示和处理方案。而到了node这里,node就相当于是浏览器底层了,直接和操作系统打交道,而浏览器的js,只是在和浏览器打交道,浏览器再和操作系统打交道。

node中不管是读数据还是写数据,不管这个数据是来自还是去向网络还是磁盘,这些IO操作的数据都在内存缓冲区中中转。node因为要处理这些网络、磁盘等IO操作,这些IO操作都是二进制数据,因此node增加了Buffer类型。

node读取出来的文件默认就是buffer数据,也就是读取出来的就是放在内存缓冲区的二进制数据。

阅读 305

Lee Tsang
javascript

d

686 声望
9 粉丝
0 条评论
你知道吗?

d

686 声望
9 粉丝
宣传栏