<aside> 📖 Freestanding 环境下也可以使用的定义

读读 man exec

</aside>

封装 (1): 纯粹的计算


string.h: 字符串/数组操作

标准库只对 “标准库内部数据” 的线程安全性负责****

封装 (2): 文件描述符


<aside> 📖 File Desciptor

FILE * 背后其实是一个文件描述符

我们可以用 gdb 查看具体的 FILE * (例如 stdout)

可以 “窥探” 到 glibc 的一些内部实现

可以加载 glibc 的 debug symbols

封装了文件描述符上的系统调用 (fseek, fgetpos, ftell, feof, ...)

</aside>

<aside> 📖 popen 和 pclose

一个设计有缺陷的 API

Since a pipe is by definition unidirectional, the type argument may specify only reading or writing, not both; the resulting stream is correspondingly read-only or write-only.

</aside>

封装 (3): 更多的进程/操作系统功能


err, error, perror

environ 被glibc init赋值

封装 (4): 地址空间


<aside> 📖 脱离 workload 做优化就是耍流氓

在开始考虑性能之前,理解你需要考虑什么样的性能

</aside>

<aside> 📖 指导思想

$O(n)$ 大小的对象分配后至少有 $\Omega (n)$ 的读写操作,否则就是 performance bug (不应该分配那么多)

<aside> 📖 设置两套系统

fast path

slow path

计算机系统里有很多这样的例子 (比如 cache)


小内存:Segregated List

大内存:一把大锁保平安