Skip to main content

底层

第一层(Javascript 依赖包)

Standard Libary 是我们日常项目常用的 HTTP Buffer 等模块

第二层(桥阶层)

Node Binding 是沟通 �C++和 Javascript 的桥梁,封装了底层 C 与 C++模块包,暴露出 JavaScript 接口给上层调用

第三层 (C/C++依赖包)

这一层是支撑 Node.js 运行的关键,由 C/C++ 实现

V8 不必多说相当于 Nodejs 的引擎(V8 相关的笔记 📒,传送门)

libuv 填平了多个平台的对异步 I/O 的不同实现,在 Win 平台上则是直接使用 IOCP 代替转让部分的功能。 (libuv 的笔记 📒,传送门)

C-ares 是使用 C 语言实现的一个异步 DNS 查找的一个底层库,著名的 Node.js curl gevent 都使用了 C-ares 作为底层

http_parser、OpenSSL、zlib 等模块实现了一些和网络请求封装有关的东西,比如说 http 解析、SSL 和数据压缩。

可以在 node 源码的/deps 目录中找到都有哪些 C/C++依赖

第四层 操作系统

第三层的内容都是 C/C++编写的依赖,在各操作系统平台下,都会直接调用系统 Api 去完成对应的任务。

libuv

libuv 是一个高性能的,事件驱动的 I/O 库,这个库负责各种回调函数的执行熟顺序。童鞋们熟知的 EventLoop 与 Thread Pool 都由 Libuv 实现。

拿文件读写操作来说,如上图 libuv 就会启用 Thread Pool 中的文件读写线程进行文件读写。读写完毕后,该线程会将读写的结果包装成函数的形式,塞入消息队列中等待主线程执行。

Node.js 中 v8 借助 libuv 来实现异步工作的调度,使得主线程则不阻塞 libuv 中的 poll 阶段,主要封装了各平台的多路复用策略 epoll/kqueue/event ports 等,对 I/O 事件的等待和到达来驱动整个消息循环。 使用 Node.js 时,使用者是单线程的概念。但了解其线程池规则之后,我们仍可隐式地去使用多线程的特性,只是线程的调度完全交给了 Node.js 的内核。

https://github.com/HXWfromDJTU/blog/issues/25