sunwukong 2019-06-26
下面我们继续看看,nodejs的第2个特性--非阻塞I/O(异步I/O)
首先,看看什么是非阻塞I/O呢?I/O操作,在程序中我们可以广泛的认为是:从数据库读数据、从硬盘上读写文件等。
在传统的单线程阻塞I/O中(如下图),
在程序运行到I/O操作时(从数据库读取数据),由于数据库返回数据需要一定时间,程序在这个时候会暂停下来,等到数据库成功返回数据后,才能继续执行程序2后面的代码;也就是说I/O阻塞了代码的运行,极大地降低了程序的执行效率。
而nodejs采用了非阻塞I/O机制,在程序运行到I/O操作后,程序会立刻跳到程序2去执行,把数据库返回的数据处理程序放到回调函数中,从而提高程序的执行效率。
阻塞模式下,一个线程只能处理一个任务,要提高服务器的吞吐量必须要用到多线程;而非阻塞下,线程永远都在工作(事件栈中有事件的话),换句话说:这个线程的cpu利用率为100%。
当I/O处理完毕后,nodejs是怎样知道该I/O完成了?这里就要说到第3个特性了--事件驱动。