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
- 事件循环 -- 这是node的执行模型,正是他才使得在node中的回调函数十分普遍
- node进程启动 > 创建一个while循环,> 循环过程为tick ==> 每个tick就是查询是否有事件待处理,如果有就取出事件及相关的回调函数。如果存在关联的回调函数就执行他们。
然后进入下个循环,如果不再有事件处理,就退出进程。
3.观察者 判断是否有事件需要处理
4.请求对象
5.执行回调
事件循环,请求对象,回调函数,I/O线程池构成了Node异步模型的基本要素
非I/O的异步API
- setTimeout()、setInterval()、setImmediate()֖process.nextTick()。
- 优先权 process.nextTick() > setImmediate()
- 视为了保证每轮循环都能较快的执行借宿,防止CPU占用过多而阻塞后续I/O