思想
小核心
提供功能最小的模块集合
小模块
让一个程序只做好一件事情,比如npm
包
小接触面
只向外界暴露出最小的功能
简单实用
简单是复杂的最高境界
什么是I/O
-
I/O操作是计算机中最慢的
-
RAM的访问时间为ns级别,速度GB/s
-
磁盘和网络的时间为ms级别,速度MB/s 或 GB/s
阻塞I/O
阻塞线程的执行,直到IO操作完成
多线程中的I/O
非阻塞I/O
-
系统调用总是立即返回,不需要等到数据的读取和写入
-
在调用的时候如果没有结果,会返回一个标识符表示当前还没有返回数据(文件描述符)
非阻塞I/O的结果获取
主动轮询资源——忙碌等待
主动轮询的缺点:
-
CPU需要一直需要循环计算,大部分的时间被浪费
事件多路分解器——事件通知接口
收集并排列一组被监视的I/O事件,并阻塞这些事件,直到有新事件来处理它们。
-
添加集合并关联READ操作
-
while中设置事件通知器,此操作是同步的,如果当前资源没有准备好,则会一直卡在此处,直到所有被监听的资源都可以准备进行READ,然后返回一个可供处理的events,并进入events loop
改造后的单线程模型
对比优势
-
只需要阻塞一个线程
-
不会影响多个I/O任务同时段的处理
-
使所有线程总的空闲时间最小化
-
无需线程切换,程序处理比较容易
Reactor模式
Node.js的并发核心
非阻塞I/O引擎——libuv
-
对不同平台的事件多路分解器的更高级别的抽象
-
实现了自己的Reactor模式,用于创建事件循环、管理事件队列、运行异步I/O和排队等
架构图
-
V8:JS解析引擎
-
libuv:I/O引擎
-
绑定:封装与暴露v8与libuv的功能
-
node-core:高级别的Node.js API核心js库
基础设计模式
回调模式——同步CPS(Continuation Passing Style)
回调模式——异步CPS
示例:
示例分析: