关于Node异步式I/O和异步式编程之I/O

原创 疯兔子 随笔 web全栈 301阅读 2017-08-28 15:11:39 举报

Node.js 最大的特点就是异步式 I/O(或者非阻塞I/O)与事件紧密结合的编程模式。

这里先介绍一下第一部分: I/O

1.阻塞I/O与非阻塞I/O概念

1.1阻塞I/O(同步I/O)
线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作), 通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞,当I/O 操作完成时,操作系统将这个线程的阻塞解除,恢复其对CPU的控制 ,令其继续运行。这种 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)。

1.2非阻塞I/O(异步I/O)
非阻塞I/O是针对所有的I/O不采用阻塞的策略,当线程遇到I/O 操作时,不会阻塞等待完成, 而是将I/O 操作发送给操作系统,继续执行下一个语句, 等操作系统完成I/O 操作以后, 会以事件的形式发送通知执行I/O 操作的线程, 线程会在特定的时候处理这个事件;
也就是线程中会不停的监听时间循环, 看是否有未处理的事件, 并以此处理。

举个通俗的例子:
例子来自知乎网友
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",
然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。

异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。
然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

2.阻塞I/O与非阻塞I/O特点#####
同步I/O(阻塞式)
利用多线程提供吞吐量
通过事件分割和线程调度利用多核CPU
需要由操作系统调度多线程使用多核CPU
难以充分利用 CPU 资源
符合线性的编程思维

异步I/O(非阻塞式)
单线程可实现高吞吐量
通过功能划分利用多核CPU
可以将单进程绑定到单核 CPU
可以充分利用 CPU 资源
不符合传统编程思维

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复