再次阅读《深入浅出Node.js》的笔记系列,内容主要摘自书中
Node 利用单线程,远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好的使用CPU。
阻塞I/O的一个特点是调用完成后一定要等到系统内核层面完成所有操作后。调用才结束。阻塞I/O造成CPU等待,浪费等待时间,CPU处理能力得不到充分利用,为了提高性能,内核提供了非阻塞I/O。非阻塞I/O调用之后会立即返回.返回之后,cpu的时间片可以用来处理其他事务。
基于libuv的架构
node提供了libuv作为抽象层,使得所有平台兼容性的判断都由这一层完成,并保证上层的Node与下层的自定义线程池及IOCP之间各自独立,Node在编译期间会判断平台条件。在Node v0.9.3,*nix自行实现了线程池来完成。
从图中可以看出,对于Network I/O和以File I/O为代表的另一类请求,异步处理的底层支撑机制是完全不一样的。
对于Network I/O相关的请求, 根据OS平台不同,分别使用Linux上的epoll,OSX和BSD类OS上的kqueue,SunOS上的event ports以及Windows上的IOCP机制。
而对于File I/O为代表的请求,则使用thread pool。利用thread pool的方式实现异步请求处理,在各类OS上都能获得很好的支持。
要强调的是,我们时常提到的Node是单线程的,这里的单线程指的是javascript执行在单线程中,在Node中,无论是*nix还是windows平台,内部完成I/O的另有线程池。