阻塞 I/O
的一个特点就是调用之后一定要等到系统内核层面完成操作之后,调用才结束。而非阻塞 I/O
则不带数据直接返回。
非阻塞 I/O
返回之后,CPU 的时间片可以用来处理其他事务,但是由于 I/O
并没有完成,立即返回的只是当前调用的状态,为了获取完整的数据,应用程序需要重复调用 I/O
操作来确认是否完成,这种重复调用判断操作是否完成的技术叫做 轮询
。
完成整个异步 io 环节的有事件循环、观察者和请求对象
在进程启动的时候,Node 会创建一个类似于 whlie(true)
的循环,每一次执行循环体的过程我们称为 Tick
。
每个 Tick 的过程就是查看是否有事件待处理,如果有,就取出事件及其相关的回调函数。如果存在相关的回调函数,就执行他们。然后进入下一个循环,如果不再有事件处理,就退出进程。
每个 Tick 的过程中,如何判断是否有事件需要处理,这里就需要引入观察者这个概念。
每个事件循环中有一个或多个观察者,而判断是否有事件需要处理的过程就是向这些观察者询问是否有要处理的事件。
在 Node 中,事件主要来源于网络请求、文件 io 等,这些事件都有对应的观察者。