nodejs深入浅出读书笔记(三)

为什么要异步I/O

-  用户体验
-  资源分配
   1. 单线程同步编程会因I/O导致硬件资源得不到更有的使用
   2. 多线程也会因为编程中的死锁,状态同步等问题让人头痛
- nodejs给出的解决方案 
   1.利用单线程,原理多线程死锁,状态同步等问题
   2.利用异步I/O让单线程原理阻塞,更好的使用CPU
   3.提供了类似于前端浏览器中的web workers的子进程,process_child

异步I/O与非阻塞I/O

 1.这种重复调用判断操作是否完成的技术交轮询
 2.事件轮询的几种方式
    a.read ==> 最原始,性能最低的一种

    b.select模式,是在read基础上的一种改进

    c.poll 相比select有所改进,采用的链表的方式避免数组长度的限制,其次它能避免不要的检查。但是当文件描述符较多时,他的性能是十分低下的

    d.epoll效率最高的I/O事件通知机制,在进入轮询的时候没有检查到I/O就会进行休眠,直到事件发生将他唤醒。

    e.kqueue 改方案与epoll相似,在freeBSD系统下存在

理想状态下的I/O

node的异步I/O

  1. 事件循环 -- 这是node的执行模型,正是他才使得在node中的回调函数十分普遍
  2. node进程启动 > 创建一个while循环,> 循环过程为tick ==> 每个tick就是查询是否有事件待处理,如果有就取出事件及相关的回调函数。如果存在关联的回调函数就执行他们。
    然后进入下个循环,如果不再有事件处理,就退出进程。


3.观察者 判断是否有事件需要处理
4.请求对象
5.执行回调

事件循环,请求对象,回调函数,I/O线程池构成了Node异步模型的基本要素

非I/O的异步API

  • setTimeout()、setInterval()、setImmediate()֖process.nextTick()。
  • 优先权 process.nextTick() > setImmediate()
  • 视为了保证每轮循环都能较快的执行借宿,防止CPU占用过多而阻塞后续I/O
posted @ 2020-04-22 13:50  登峰造楼  阅读(125)  评论(0编辑  收藏  举报