# 简介

**NodeJS是什么?**

Node.js是一个基于Chrome V8引擎的Javascript运行环境(runtime)。

Node.js 使用事件驱动， 非阻塞I/O模型而得以轻量和高效，非常适合在分布式设备上运行数据密集型的实时应用。

> 非阻塞I/O：I/O时函数立即返回，进行不等待I/O完成
>
> 阻塞I/O：I/O进程休眠等待I/O完成后进行下一步
>
> 事件驱动：
>
> * I/O等异步操作结束后通知
> * 观察者模式

**为什么偏爱NodeJS?**

* 前端职责范围变大，统一开发体验。
* 在处理高并发、I/O密集场景性能优势明显

> CPU密集与I/O密集
>
> * CPU密集：压缩、解压、加密、解密
> * I/O密集：文件操作、网络操作、数据库
>
> 高并发应对：
>
> 增加机器数
>
> 增加每台机器的CPU数-多核
>
> 进程与线程：
>
> 进程：是计算机中的程序关于某数据集合上的一次运行活动，是系统进行资源分配和调度的基本单位
>
> 多进程：启动多个进程，多个进程可以一块执行多个任务
>
> 线程：进程内一个相对独立的、可调度的执行单元，与同属一个进程的线程共享进程的资源
>
> 多线程：启动一个进程，在一个进程内启动多个线程，这样，多个线程也可以一块执行多个任务

**NodeJS单线程**

* 单线程只针对主进程，I/O操作系统底层多线程调度。（NodeJS是主进程发送一个请求，这个请求交给I/O之后它是由操作系统底层多线程，多进行调度，达到最高性能，只是单线程的进行监听，操作系统告知I/O好了）
* 单线程并不是单进程，多核可以使用cluster模块。

**常用场景：**

* Web Server
* 本地代码构建
* 实用工具开发
