Node.js底层原理
图片全部搬运自学习Vue3 第二章(配置环境)自己懒得做图了。
Node.js的构成
Node.js主要由V8、Libuv和第三方库组成。
- Libuv:跨平台异步IO库(处理事件循环),除了IO功能还提供线程、进程、信号、定时器、进程间通信、线程池等功能。
- 第三方库
- 异步DNS解析(cares)
- HTTP解析器(旧版:http_parser;新版:llhttp)
- HTTP2解析器(nghttp2)
- 解压压缩库(zlib)
- 加密解密库(openssl)
- 等等等等
- V8:实现JS解析(把js编译成机器码)、执行和自定义拓展
从上到下分为三层:
- 应用层:Node.js API各种模块,基于Libuv,因为可能涉及IO流操作
- 桥梁层:与底层C或C++通信
- 底层(C++或C):处理底层机制
Libuv
loop参数:事件循环结构的结构体
uv_loop_alive:用于注册loop,判断loop里有无任务(是否还有活动),有就开始循环,没有就退出
loop还在活动的情况:
- 有被引用的活动句柄或活动请求
- 有正在关闭的句柄
uv_update_time:执行setTimeOut(过段时间后执行回调)
uv_run_timers:执行setInterval(每隔一段时间都执行回调)
- 数据结构:链表+二叉堆
- 把最快过期的节点放到上面,判断是否过期
- 如果过期就执行回调
- 如果没有过期,查看repeat,区分setTimeOut和setInterval
- 如果是setTimeOut,任务过期后就结束了
- 如果是setInterval,进行重复执行
uv_run_pending:处理IO流的回调
uv_run_idle&uv_run_prepare:处理其他各种队列
uv_io_poll:处理网络相关
uv_run_closing_handles:结束,关闭服务器
评论