《深入浅出Node.js》读书笔记+个人思考(二):异步I/O

来源:互联网 发布:java中long转换成date 编辑:程序博客网 时间:2024/05/17 01:56

伴随着异步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 调用图解

这是一个例子

这里写图片描述

整个异步调用的流程

这里写图片描述


总结

每次不知道异步是啥东西,就想自己在饭店是怎么点菜的就行了

0 0
原创粉丝点击