阅读 137

【8.29】node 原理 - 异步 I/O - 为什么需要异步 I/O?

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

为什么需要异步I/O

为什么异步 I/O 对于 nodejs 这么重要呢,因为现在 web 应用已经不是单台服务器就可以胜任的时代了,我们总会进行并发请求。我们下面从用户体验和资源分配着两个方面,说明异步 I/O 的优势。

用户体验

我们在实际编程过程中,同时请求多个资源的情况非常普遍,如果耗时分别为 A、B、C,那么同步和异步的方式,耗时分别为 A+B+C 和 max(A,B,C),下面的图是从CPU一级缓存到网络数据访问的开销,可见网络的开销是非常大的

image.png

(时钟周期也称为振荡周期,定义为时钟频率的的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。)

这就是异步 I/O 在 nodejs 中如此盛行,甚至将其作为主要设计理念的原因,I/O 是昂贵的,分布式 I/O 是更昂贵的。只有后端能够快速响应资源,才能让前端的体验变好

资源分配

在 nodejs 之前,完成一组互不相关的任务,有两种方式完成:

  • 单线程串行依次执行
  • 多线程并行完成

两种方式都会有各自的优势和缺点:

单线程顺序执行任务,比较符合开发人员的思维方式,但是它的缺点在于性能,任意一个执行较慢的任务,都会阻塞后续的代码执行,使得资源不能很好的被利用,处理的时间长。

多线程并行完成,如果创建多线程的开销小于并行执行,那么多线程的方式是首选的,另外多线程可以很好的利用多核 CPU。但是在多线程的方式中,经常需要处理锁、状态同步等问题,会比较麻烦

于是 nodejs 的方案是:使用单线程,避免多线程死锁,状态同步的问题;使用异步 I/O,避免单线程阻塞,更好的利用 CPU。

为了弥补单线程无法利用多核 CPU 的问题,nodejs 提供了 child_process,这个子进程可以通过工作进程更好的利用 CPU。

下面是异步 I/O 的示意图:

image.png

本文是对深入浅出nodejs中异步I/O一章的学习总结,欢迎评论和点赞~

文章分类
后端
文章标签