Today I Learnt
发表于更新于阅读时长 1 分钟阅读更多
2022.03.22 ES module 中不能 named import commonjs 是因为前者的 export item 是在执行前静态计算的,而后者的是在运行期生成的
2022.05.14 JVM 上传统的 GC mark 时需要较长时间的 STW,而新出的 Shenandoah 和 ZGC 的都选择通过 read barrier 来完成极短 STW 时间
2023.01.02 memory order
级别 | 作用 | 用途 |
---|---|---|
Relaxed | - | 计数器 |
Acquire Release |
Acquire 时之前别的线程的所有读写都可见,Acquire 之后的读写不会被重排到 Acquire 之前 Release 时之后所有读写都对别的线程可见,Release 之后的读写不会被重排到 Release 之后 |
锁 |
Sequencial Consisitency | 对多个原子变量的更改有全局一致的顺序 | 有依赖关系的锁 |
2023.01.07 不同平台的 I/O 事件通知机制
dsada | epoll | kqueue | Event Port | IOCP |
---|---|---|---|---|
创建实例 | epoll_create | kqueue | port_create | CreateIoCompletionPort |
监听事件 | epoll_ctl | kevent | port_associate | CreateIoCompletionPort |
取消监听事件 | epoll_ctl | kevent | port_disassociate | - |
接收事件(阻塞) | epoll_wait | kevent | port_get/port_getn | GetQueuedCompletionStatusEx/GetQueuedCompletionStatusEx |
其中大部分是 Readiness based(可以开始读取数据时通知),ICOP 是 Completion based(读取数据完成时通知)
2023.03.14 TS 和 Haskell 一样,支持一定程度的 recursive type/coinductive type
ts
function fib(m: number, n: number): [number, () => ReturnType<typeof fib>] {return [m, () => fib(n, n + m)]}
haskell
fib m n = m : fib n (m + n)
2023.05.03 rust 中禁止形如.0
的字面量是因为无法避免a.0
的二义性
2023.06.02 Wasm 中无法访问程序栈,因此 GC 无法找到在栈上的引用,为此一些实现会在 data segment 前/后把引用再分配一遍,扫描的时候从这里开始。这种技术被称为 shadow stack
2024.05.11 CPU 的 L1 缓存区分指令缓存和数据缓存的原因是指令缓存是单个核心独享,可以省掉核心间同步机制
2024.10.26 不可变 avl tree 一般高度差大于 2 才旋转,因为它的旋转成本比较高