【1. 概念】
【进程】 process 资源分配和调度任务。
【单线程】进程(黑盒)是线程thread(工人)容器, 单线程是一个工人干活。
异步任务是走队列的, 同步任务过多占用主进程, 可能会导致线程阻塞, 就是只有一个人干活干太长时间了,其他任务block。
【进程通信】多进程用fork模式, 每个都是隔离独立空间(多造出来几个黑盒)。只能建立IPC通信, 进程间才能共享。
可以利用CPU核数, 创建多个进程。
【2. 模型】
【Node是单线程模型】基于事件驱动/非阻塞模型, 适合高并发场景 高I/O类型。
原因: 利用事件循环机制,不是启动每个线程为每个请求服务,资源占用较少。
避免线程创建和切换产生的资源开销。不适合密集计算类型, 会CPU飙升为服务挂掉情况。
Node处理计算密集型问题: 长时间运行,占用资源,CPU时间片不会释放,后续I/O无法发起。
【Java是个多线程模型】利于密集计算类型。不适合高并发类型。
原因在于多线程是每来一个请求都要创建线程, 执行期间需要切换线程带来的开销。
【3. 多进程 + 单线程模式 / 解决什么问题?】
- Node是单进程 + 单线程模式, 但是可以利用多核CPU, 多开辟几个进程空间, 就是多雇佣几个工人干活。
=> 扩展 多进程 + 单线程模式
- 多进程不是为了解决高并发, 主要解决的是 Node CPU利用率不足问题, 利用机器多核特性。
浏览器有 UI线程(渲染引擎是多线程) + JS单线程
UI线程和JS线程互斥,因为JS 会影响UI的,只能是JS空闲,UI才会更新。
假设JS是多线程,那么DOM操作也是多线程,DOM不知道听谁的了,都是leader很混乱。
不如只有一个worker 去调度,异步放到队列里。等待执行。
浏览器对异步机制 有两个队列 micro queue 和 macro queue
只有同步 > micro queue > macro queue 只有当前队列空了,才能走下一步
Node模块分为: 核心模块 和 文件模块。
核心模块: fs http math ....
文件模块:
const a = require('/src/a.js')
1. 路径分析 '/src/a.js'
2. 文件定位
3. 编译执行
- 核心模块 (例如http, fs) 是直接被写到内存中,这样会二次加载更快。
- 文件模块 (RD写的代码), 运行时动态加载,按照路径分析,定位,再编译执行。