图解NodeJS【基于事件、回调的单线程高性能服务器】原理

刚开始了解Node感受很吊,各类说高性能,但是一直不理解为何单线程会比多线程快?为何异步IO比非阻塞IO快?所以,本篇在阅读相关书籍后,根据本身的理解,整理此文,若有错误,仅表明理论不精,必当修改,以避免误导他人。还请多多指正.....javascript

关于阻塞IO和非阻塞IO

系统内核只有两种IO模式—— 阻塞IO和非阻塞IO。这里的IO可不单单是读取文件内容,而是更为普遍的概念。好比Socket啊,网络Socket,磁盘读取等等,这些相比于CPU计算都是很耗时的。java

下图为阻塞IO的工做模式:linux

阻塞IO在须要获取数据进行IO操做时,CPU会等待,当读取完成后,再继续运行。那么很容易就能想到,若是读取很耗时,CPU就会长期处于阻塞状态,显然效率很低。windows

再看看非阻塞IO:网络

非阻塞IO在进行IO操做时,会直接返回。而后CPU该干吗干吗,只不过须要必定的策略来肯定什么时间请求数据完成,这个时候就须要一些轮训策略了,好比select poll等等。那么这个也应该能想到,当有长期的IO操做,会白白执行大量的查询操做,效率也不高。(固然目前的系统内的非阻塞IO都是很高级的玩法,卤煮也没有仔细研究,就不献丑了)多线程

异步IO与Node工做原理

经过上面两种典型的IO操做,很显然,一种理想的模型是,有IO操做时,系统去执行IO操做,CPU该干吗干吗,当请求数据完成后,就通知CPU继续执行刚才没有完成的工做。异步

Node就是利用了javascript的回调函数思想,实现这种工做模式。函数

那么为何单线程的Node会效率很高呢?什么又是事件机制呢?

原来,一直说的单线程,都是javascript端的,Node底层仍是使用c来实现,所以底层仍然是多线程的。只不过,Node基于不一样的操做系统linux或者windows之上实现了一个封装层,用户执行的操做命令会转交给这个封装层,由它再去判断操做系统,进而调用相应平台的c代码。性能

有点跑题了,简单的说,就是Node只是表面暴露给用户的javascript代码是单线程的,底层仍是多线程的。

说到事件机制,就要上图了!
操作系统

简单的解释一下,当咱们使用Node的时候,会在javascript触发一些命令调用方法,这些方法会被包装成一个对象,放入线程池,而后前面的方法就返回了,继续执行下面的JS代码。

线程池中采用多线程的方式执行,执行完的对象放入事件循环队列。

事件循环队列采用相似while(true)这种循环的方式,不断的查看是否有事件,而且读取是否包含回调,因为前面回调函数被包装到对象中,这里直接调用执行就能够了。

经过这三种阶段,就实现了 【 异步请求——>回调 】 的工做模式。

相关文章
相关标签/搜索