Node.js学习笔记(一)---对异步IO的理解
Node提供libuv作为抽象封装层:
Node.js的异步IO:
操作系统对I/O的操作分为阻塞I/O和非阻塞I/O。阻塞I/O造成了CPU的等待,使CPU不能得到充分的利用;而非阻塞I/O虽然不必等待完整I/O的返回,但需要通过轮询重复的调用判断操作,这种判断操作也是对CPU的一种浪费。我们希望非阻塞I/O可以免去轮询的步骤,在实际I/O操作完成后,通过返回完成信号通知应用程序即可。
Node使用了观察者模式和事件循环机制来实现这种异步I/O。这里以去餐厅消费为例,异步调用相当于去餐厅就餐的顾客,顾客将菜单交给服务员,即Node的I/O观察者,厨房即Node的事件循环机制询问服务员是否还有要做的菜,服务员将顾客的菜单交给厨房处理。
Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。
从上述流程可以看出,Node是以事件为驱动来实现异步I/O的。