关于异步I/O为何在Node里如此重要,这与Node面向网络设计不无关系。在当前网络环境下,并发已是编程中的标配。具体可以从如下两那个方面说起。
3.1.1 用户体验
早期浏览器中Javascript是单线程执行,并且与UI渲染共用一个线程,这意味着Javascript执行时,UI渲染和响应都处于停滞状态。
在B/S模型中,网络限速也会给网页的实时体验造成很大麻烦。如果网页需要获取一个网络资源,通过同步的方式获取,那么Javascript就需要等待资源从服务器端获取后才能继续执行,这期间UI将停顿,不响应交互行为。如果采用异步请求,那么在下载资源的同时,Javascript和UI的执行都不会处于等待状态,可以继续响应用户交互行为。
3.1.2 资源分配
从资源分配的层面来进一步分析异步I/O的必要性。我们知道计算机发展过程中将组建进行了抽象,分为I/O设备和计算机设备。
现有业务的任务执行顺序主要有两种:
1.单线程串行依次执行。
2.多线程并行完成 。
如果创建多线程的开销小于并行执行,那么多线程的方式是首选。多线程的代价在于创建线程和执行线程上下文切换的开销比较大。另外在多线程编程中面临锁,状态同步等问题,这是多线程诟病的主要原因。
在计算机资源中,通常I/O与CPU计算机之间是可以并行进行的。但同步的编程模型导致的问题是,I/O的进行会让后续任务等待,这造成资源不被更好地利用。
操作系统会将CPU时间片分配给其余进程,以公平而有效地利用资源,基于这一点,有的服务器为了提升响应能力,会通过启动多个工作进程来为更多的用户服务。
异步I/O可以算作Node的特色,因为它是首个大规模将异步I/O应用在应用层上的平台,它力求在单线程上将资源分配得更高效。