![4e73296238ee9adb356c89983d3d9bd4.png](https://i-blog.csdnimg.cn/blog_migrate/cddf9304642bfcaac688cf9daad1ed5b.png)
1. NodeJS是什么
1.1 Node.js is a JavaScript runtime build on Chrome's V8.
Node.js并不是一门语言,JavaScript才是。Node.js是一个runtime,运行在Chrome的V8引擎上,且Node.js并不能使用JavaScript的全集,它不能使用DOM,BOM等浏览器API。
1.2 Node.js uses an event-driven, non-blocking I/O model.
事件驱动,非阻塞I/O
2. 非阻塞I/O
- 阻塞I/O:I/O时进程休眠等待I/O完成之后再进行下一步。
- 非阻塞I/O:I/O时函数立即返回,进程不等待I/O结果。
3. 事件驱动
- I/O等异步操作结束后通知主进程
- 观察者模式
4. NodeJS的优势
4.1 处理高并发、I/O密集场景优势明显。适用于web。
首先知道一个事实(常识):计算机CPU运算非常之快,应用的性能瓶颈主要出在I/O上。
CPU密集与I/O密集:
- CPU密集:计算、加密解密、压缩、图像处理等
- I/O密集: 文件操作、网络操作、数据库操作等
web场景:
- 静态资源获取
- 数据库操作频繁
- 渲染页面
5. 高并发应对之道:
- 增加机器数
- 使用更好的机器:多核cpu机器
- 使用更好的模型
线程与进程
- 进程:是计算机中的程序关于某数据集合行的一次运行活动,是系统进行资源分配和调度的基本单位。
- 多进程:启动多个进程,多个进程一块执行多个任务。
- 线程:进程内一个相对独立的、可调度的执行单元,与同属一个进程的线程共享资源
- 多线程:启动一个进程,在进程内启动多个线程,这样,多个线程可以同一时间执行多个任务。
Java处理高并发:
每来一个请求,就会因为IO操作而阻塞住,java采用多进程模式,为每个请求分配一个进。其劣势:
- CPU分配的最大进程数是有限的,超过限度就要排队。
- CPU大量时间处于空闲状态(IO操作占大头)。
nodejs处理高并发:
![15f4a1128dd922be13569f59c8b155f4.png](https://i-blog.csdnimg.cn/blog_migrate/3d7987ac6e1c2bbbb118dd87d9871673.jpeg)
- cpu利用率高,IO操作不会阻塞cpu。
- event loop 主线程:cpu只开一个进程, 进程内也只开一个线程。
- 所谓的nodejs单线程指的是主线程,IO操作是系统底层多线程调度。
- nodejs与多核:使用cluster模块可利用CPU多核,在每个核上启动一个进程,不会浪费CPU多核能力。
6. 使用场景:
- web server: 高并发,IO密集
- 前端代码本地构建:低并发,cpu计算量大。从性能角度考虑,nodejs并不适合。但是由于前端工程师更熟悉js语法,前端代码构建打包等工具中nodejs应用非常广。