一个小广告,作者自己开发的一个收集优质编程教程和视频(包括大量MOOC系统课程和实践课程)的网站,有兴趣的同学可以看看,青苹果网www.qingp.netnode中,buffer是“缓冲区”的意思,buffer恰恰是放在缓冲区中的二进制数据。这里有一个缓冲区的概念。缓冲区是内存空间的一部分,在内存空间中预留了一定的存储空间,用于存放IO输入输出数据。计算机之所以需要缓冲区,是为了平衡IO过程中不同IO介质的速度差异。例如,要向磁盘写入一段数据,计算机会先将数据写入内存缓冲区暂存。要么数据已经写入,要么缓冲区已满,CPU会将数据写入缓冲区。数据,一次写入磁盘。你为什么要这样做?如果有一条数据要写入,一共有10个数据块。同时假设cpu向内存缓冲区写入数据需要1秒,向磁盘写入数据需要10秒。然后根据buffer机制,将10条数据写入内存buffer需要10秒,然后CPU将内存buffer中的数据写入磁盘也需要10秒,然后这一段数据最后写入存储介质。总共用了20秒。而如果没有内存缓冲区,每条数据都是由CPU直接写入磁盘,每次写入需要10秒,那么十条数据总共写入磁盘十次,那么这条数据就是写入存储介质总共十秒钟。花了100秒。区别很明显,花100秒会完全降低cpu的速度,以至于它无法做其他事情。本质上,这是因为CPU无法一次性读取到这段数据(比如一个文件)。如果可以的话,那么一次性把整个文件数据读出来,然后直接一次性写入磁盘也只需要10秒,这当然好,但是这样一步到位的事情是不可能的。CPU不可能一次性取出整个文件数据。必须一点一点地读。我也得一点一点的写,那得有个过程。缓冲区与IO直接相关。正是因为有了网络IO和磁盘IO,才有了buffer。在过去的js中,js是为浏览器而生的。在浏览器中,js本身是没有IO操作的。js发送什么ajax请求,选择文件上传。好像js是有IO操作的。其实,这些都是由浏览器自身的底层代码在操作系统上实现的。js本身是没有IO的。因为没有IO,以前的js没有二进制数据表示和处理方案。说到node,node相当于浏览器的底层,直接和操作系统打交道,而浏览器的js只是和浏览器打交道,浏览器在和操作系统打交道。无论数据是在node中读取还是写入,无论数据来自或去往网络还是磁盘,这些IO操作的数据都是在内存缓冲区中传输的。因为node要处理这些网络、磁盘等IO操作,这些IO操作都是二进制数据,所以node增加了Buffer类型。node读取的文件默认是buffer数据,即读取的是放在内存buffer中的二进制数据。
