Skip to content
Calvin's Blog

摸鱼精选第 1 期

Nov 22, 2021 — Reading

Node.js 主要是由 V8、Libuv 和一些第三方库组成。

其中 libuv 是异步任务的核心,本文探讨了 epoll 的模型与限制,无法读写文件、不适合 CPU 大量计算等操作,于是 Libuv 引入线程池解决这几个问题,最后作者梳理了 Libuv 的事件循环。

从三个方面介绍 V8:

  1. 介绍 V8 在 Node.js 的作用和 V8 的一些基础概念
  2. 介绍如何通过 V8 执行 JS 和拓展 JS
  3. 介绍如何通过 V8 实现 JS 和 C++ 通信

Node.js 中有五种模块加载器。

  1. JSON 模块加载器
  2. 用户 JS 模块加载器
  3. 原生 JS 模块加载器
  4. 内置 C++ 模块加载器
  5. Addon 模块加载器

作者从 CPU 调度的源头上开始梳理同步、异步的区别,异步的收益。

异步并不会让逻辑上串行的任务变快,只能让逻辑上可以并行的任务执行更快

异步操作离不开操作系统的底层支撑,目前三大 OS 都有自己实现机制,原理也不尽相同:

Linux 的 epoll 的设计和性能都不如 windows 的 iocp,最新的 5.1 内核加入了 io_uring,算是向 windows 的 iocp 致敬了。

read_async_v2('qq.com', function (data) {
send_to('[email protected]', data);
});
read_async_v2('jd.com', function (data) {
write_to('jd.html', data);
});
// 编译器帮我们把while循环自动插到这里
// 或者什么异步框架帮我们做while循环

用回调来处理异步就会遇到“回调地狱”的问题,JS 为了解决这个问题引入 Promise 范式。作者从 0 开始梳理 Promise 的实现过程,遇到的问题以及解决办法。

关于 Linux io_uring 异步 IO 接口的资料:

Rust 在底层编程上有安全优势,但是并不是说只适合干 C/C++的活。上层应用方面现在也用的很多,尤其是做一些 cli 工具的时候。

本文提到两个 TextField 需要注意的问题:字数统计和文字居中。