关于node.js的一些简单理解

1、Node.js的总体感知

Node.js是JavaScript的一个服务端运行环境。使得JS能够像PHP、Python等语言同样能够进行服务端程序开发。
传统JS中的DOM和BOM被剔除,首先它遵循EMCAScript标准实现核心JavaScript,在此基础上,又实现了诸如模块、包、文件系统、网络通讯和操做系统API等新的功能。node

图片描述

Node内部采用Google Chrome的V8引擎,做为JavaScript语言的解释器,在该引擎当中执行ES代码,另外Node平台还提供了一些组件,经过自行开发的Libuv库,用于调度操做系统资源。服务器

2、Node.js在Web当中的做用

一、 作动态网站

图片描述

二、分发数据请求,渲染HTML页面

图片描述

3、Node.js的核心特性(事件驱动和非阻塞)

首先先了解一下进程和线程的概念。
进程:操做系统为应用程序分配资源的一个单位。用来给应用程序提供一个运行环境。
线程:用来执行应用程序中的代码,一个进程内部,能够有不少线程。但在一个线程内部,同时只能作一件事。
某个应用程序启动以后会默认建立一个主线程,用于执行咱们的代码。但用户的代码当中一般会有一下耗费时间的阻塞代码,对于Java、.Net、PHP这种一个进程当中能够有多个线程的应用程序,在执行代码的过程中,会开辟多个线程去分别执行那些主线程当中会发生阻塞的代码。网络

多线程存在的问题:多线程

  1. 建立线程耗费资源
  2. 线程数量有限
  3. 线程之间共享某些数据,同步某个状态都很麻烦
  4. CPU在不一样线程之间转换很是耗时

但对于Node来讲,因为Node采用Chrome V8引擎处理JavaScript脚本,而V8最大的特色是单线程运行。即Node内部只容许有一个线程,故为了提升代码的执行效率,避免代码阻塞的状况的出现。Node当中采用大量的异步操做。即Node当中全部会发生代码阻塞的操做都是异步的。并发

3.一、Node当中的事件驱动模型

图片描述

在Node的内部有一个事件队列,事件队列由一对一对的键值对构成,即事件:对应的回调函数的形式。Node的主线程在执行用户的代码的过程当中,先执行那些非阻塞的代码,当执行到相似于文件操做或网络操做之类的阻塞代码,则会根据其任务代码出现的顺序,将其放入事件队列当中,与该任务相关的代码放在该任务的回调函数当中。异步

即Node主线程在执行程序的过程,会直接执行那些非阻塞的代码,但若是在执行的过程当中,遇到阻塞型的代码,主线程的处理仅仅为将该事件函数及其对应的回调函数放进事件队列当中,暂不执行。等主线程把程序当中那些非阻塞的代码所有执行完了以后,再按照从上到下的顺序,从事件队列当中来取事件任务来执行。函数

当Node执行事件队列当中的任务时,先执行阻塞事件,而后再开始执行该事件对应的回调函数,在执行其回调的函数的过程中,一样也是先执行那些非阻塞的代码,对于遇到回调函数当中的阻塞事件时,一样暂不执行,将该事件及其对应的回调函数,插入事件队列的尾部。oop

3.二、Node内部的线程池模型

图片描述

Node内部有一个事件循环(Event Loop)来依次从事件队列(Event Queue)当中取事件来执行,对于事件队列的一个键值对来讲,从开始执行该阻塞事件,到开始执行该事件对应的回调函数的过程中,可能会设计文件或网络操做,可能会阻塞很长时间,但实际上代码不会卡死在这里。由于这里的阻塞操做不是由node主线程来作的,而是交给另外一个线程来完成的。
在node底层维护了一个线程池,该线程池内部又维护了不少的线程,当Event Loop在依次执行事件队列当中的事件时,若遇到阻塞操做,就交给线程池当中的线程来作,这对于主线程没有任何影响,主线程仍然继续沿着Event Loop往下走,接着去处理事件队列当中的下一个事件。性能

不必定是等事件队列当中的上一个事件的回调函数执行完成以后,才开始执行下一个事件。网站

当线程池当中的线程执行完了交给它的任务以后,它会通知正处于Event Loop当中的主线程,让其来执行对应的回调函数。而后该线程得以释放,返回到线程池当中。

在Node内部其实是多线程的,对于相似于文件操做之类的阻塞操做,让另外一个线程去耗费这个时间,而主线程在一直不停的工做。通常咱们说node是单线程的,是由于对于外界变成的API来讲,全部的任务都是由一个线程来完成,只有内部的一些阻塞操做才交给内部的线程池来完成。

Node将全部的阻塞操做交给内部实现的线程池,而Node主线程自己则负责不停的往返调度。非阻塞最大的性能优点就是,能充分利用单核CPU的优点,若是让单核CPU不断地在多个线程之间切换,会形成很大的性能损耗。Node采用基于事件驱动的异步I/O模型,极大地提升了HTTP服务器的并发性能。

相关文章
相关标签/搜索