刚开始了解Node感受很吊,各类说高性能,但是一直不理解为何单线程会比多线程快?为何异步IO比非阻塞IO快?所以,本篇在阅读相关书籍后,根据本身的理解,整理此文,若有错误,仅表明理论不精,必当修改,以避免误导他人。还请多多指正.....javascript
系统内核只有两种IO模式—— 阻塞IO和非阻塞IO。这里的IO可不单单是读取文件内容,而是更为普遍的概念。好比Socket啊,网络Socket,磁盘读取等等,这些相比于CPU计算都是很耗时的。java
下图为阻塞IO的工做模式:linux
阻塞IO在须要获取数据进行IO操做时,CPU会等待,当读取完成后,再继续运行。那么很容易就能想到,若是读取很耗时,CPU就会长期处于阻塞状态,显然效率很低。windows
再看看非阻塞IO:网络
非阻塞IO在进行IO操做时,会直接返回。而后CPU该干吗干吗,只不过须要必定的策略来肯定什么时间请求数据完成,这个时候就须要一些轮训策略了,好比select poll等等。那么这个也应该能想到,当有长期的IO操做,会白白执行大量的查询操做,效率也不高。(固然目前的系统内的非阻塞IO都是很高级的玩法,卤煮也没有仔细研究,就不献丑了)多线程
经过上面两种典型的IO操做,很显然,一种理想的模型是,有IO操做时,系统去执行IO操做,CPU该干吗干吗,当请求数据完成后,就通知CPU继续执行刚才没有完成的工做。异步
Node就是利用了javascript的回调函数思想,实现这种工做模式。函数
原来,一直说的单线程,都是javascript端的,Node底层仍是使用c来实现,所以底层仍然是多线程的。只不过,Node基于不一样的操做系统linux或者windows之上实现了一个封装层,用户执行的操做命令会转交给这个封装层,由它再去判断操做系统,进而调用相应平台的c代码。性能
说到事件机制,就要上图了!
操作系统
经过这三种阶段,就实现了 【 异步请求——>回调 】 的工做模式。