NodeJS -- 异步I/O

一、NodeJS概述:

       Node是一个提供Chrome环境运行Javascript的平台,用于构建高速、可伸缩的网络程序。

主要优势

  • 前后端编程语言、环境统一
  • I/O高性能
  • I/O并行机制

 其主要应用场景有:

  • 前后端编程语言环境统一
  • 高性能I/O用于实时应用
  • 并行I/O使得使用者可以更高效地利用分布式环境
  • 并行I/O,有效利用稳定接口提升Web渲染能力
  • 云计算平台提供Node支持
  • 游戏开发领域
  • 工具类应用

二、异步I/O

 1. 为什么要异步I/O

  • 提升用户体验:在同步的情况下,两个请求用户所等待的时间是T1 + T2, 但是通过异步方式,使用时间变为 MAX(T1, T2),大大节省了等待时间。
  • 资源分配:在处理一组互不相关的任务时,目前主要方法有两种:单线程串行依次执行、多线程并行完成。在单线程串行的过程中,I/O花费了很多的时间用于等待,导致后续的任务被阻塞无法执行。在多线程的方案中,需要花费资源去创建线程,线程上下文切换,并且经常面临锁、状态同步等问题。Node使用单线程方案,并利用异步I/O让单线程远离阻塞,更好的利用CPU;

2. 异步I/O实现

     Node异步I/O模型的基本要素由:事件循环、观察者、请求对象、I/O线程池四个部分组成。

      事件循环:在进程启动时,Node便会创建一个循环,每执行一次循环体的过程称为Tick。如果存在关联的回调函数,就执行它们。然后进入下一个循环,如果不再有事件处理,就退出进程。在Window下,事件循环基于IOCP创建,而在*nix下则基于多线程创建。

      观察者:在每个Tick的过程中,通过观察者告诉事件循环是否可以有可以执行的事件。在Node中,事件主要来源于网络请求、文件I/O等,这些事件对应的观察者有文件I/O观察者、网络I/O观察者等。

     请求对象: 请求对象是Js发起调用到内核执行完I/O操作的过渡过程中,存在的一种中间产物。在JS发起调用过程中,Node会创建一个请求对象(不同操作的请求对象也不同),该调用的入参和该方法等状态都会封装在请求对象中。

     执行回调:组装好请求对象、送入I/O线程池等待执行,已经完成了异步I/O的第一部分,回调通知是第二部分。在Tick执行过程中,观察者会调用IOCP相关的查询状态方法(GetQueuedCompletionStatus)检查线程池中是否有执行完的请求,如果存在,会将请求对象加入到I/O观察者的队列中,然后将其当作事件处理。

三、非I/O的异步API

  Node大多情况下会用到异步I/O,但其中还存在一些与I/O无关的异步API,它们分别是:setTimeout()、setInterval()、setImmediate()和process.nextTick()。

你可能感兴趣的:(Node)