node的事件驱动、异步I/O机制

node的特点

node的出现是为了js不仅可以在浏览器上运行,还可以操作系统上运行,提供了js运行的平台,可以看做一个虚拟机。

  • 特性是:异步I/O,单线程(特指js部分),事件驱动和回调。
  • 操作系统目前指Linux和windows平台,两者实现异步I/O的方式是不同的,简单来说都是对理想化异步I/O的模拟,node对通过libuv层这两个平台进行了抽象封装。
  • 区别:Linux是通过自定义线程池和阻塞I/O实现,而Windows是通过IOCP系统内核对线程池进行管理。

理想的异步I/O

  • 构成:事件循环、观察者、线程池I/O、请求对象
  • Node实现异步I/O的原理,是利用事件循环,js线程像一个分配任务和处理结果的大管家,而I/O线程池里的各个I/O线程都像是小二兢兢业业完成分配来的任务,互不依赖,保持整体的高效率。
  • 理想化的异步I/O: 在进程启动时,启用事件循环,取出待执行的事件执行,异步调用封装请求对象和回调函数放入线程池等待。观察者观察线程池中的I/O操作是否完成,执行完毕后将执行结果放在请求对象中,通知IOCP调用完成,放入事件循环中,事件循环中从I/O观察者取到可用的请求对象,取出回调函数和执行结果执行。

单线程的弊端

单线程结合异步I/O,导致node非常擅长处理I/O密集问题,那么对于CPU密集型的任务,一些会占用大量CPU时间则可能阻塞后续执行,无法继续调用异步I/O,已完成的异步I/O回调函数也得不到执行,为了解决这个问题,node借鉴了V8的高执行效率,通过类似浏览器启动web workers工作线程专用于计算,node采用了child_process子进程,通过将计算分发到各个子进程来将大量的计算分解掉,通过进程间的事件消息通信来传递结果,保持应用模型的简单和低依赖。通过Master-Worker主从管理模式,保证进程的健壮性。

  • 这里要说到一个事实,实际上,异步IO的阻塞所耗费的用时远远超过普通计算所占用的时间,即使真的有一些纯计算阻塞了CPU,那么node也提供了相应的手段:
    1、通过扩展C/C++的方式更高效的利用CPU;
    2、通过子进程的方式来将一部分node进程当做常驻服务进程用于计算,利用进程间的消息来传递结果,实现IO和计算分离。

你可能感兴趣的:(node的事件驱动、异步I/O机制)