伴随着异步I/O的还有事件驱动和单线程,它们构成Node的基调
利用单线程,远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好地使用CPU
异步 I/O实现现状
类比:
- 点菜的人 -> 应用层
- 点菜员 -> 观测者
- 点菜 -> 事件
- 厨师(厨房) -> 系统内核
- 一个点菜台 -> 一I/O线程
操作系统对I/O的实现
- 阻塞I/O:点菜排队,你站在点菜台前点完菜后等待厨师把你的菜做好再到下一个人(肯德基)
非阻塞I/O:点菜排队,你点完菜后拿着小票在一边等待,下一个人来点菜(饭店)
- 使用轮播技术
- 大部分轮询技术:你需要不时地去点菜台询问菜是否做好了,期间不干别的事情
- epoll轮询技术:你站在一旁发呆,什么事也不干,菜烧好了有服务员叫号通知
理想的非阻塞异步I/O :
点完菜,拿着小票在一旁刷个微博,逛个朋友圈,菜做好了服务员叫号,你去取
现实的异步I/O:
到a点菜台点海鲜,拿个小票,到b点菜台点甜点,拿个小票……到一旁玩手机,哪个点菜台叫号了就去拿哪个
Node架构
Node的异步I/O
不多说,上图,最清晰
执行每次循环叫做Tick
可以想象每次厨师出来询问点菜员是否还有客人点菜,就和上图判断是否还有事件一样
fs.open 调用图解
这是一个例子
整个异步调用的流程
总结
每次不知道异步是啥东西,就想自己在饭店是怎么点菜的就行了