Update 计算机操作系统 - 概述.md

补充 vDSO 调用不出现在 strace 中的说明。
This commit is contained in:
CyC2018
2026-11-02 01:31:14 +08:00
parent f6cf5731cb
commit d1d0a64068
+1 -1
View File
@@ -135,7 +135,7 @@ fork 调用一次、返回两次,以及 fork 与 clone 的关系,见[进程
减少系统调用开销的做法主要有以下几种:
- 批量处理:writev 一次系统调用写入多个缓冲区(writev(2));
- 在用户态完成:vDSO(virtual dynamic shared object)是内核自动映射到每个进程中的一小段共享代码,在支持的时钟源上,clock_gettime 等调用不再陷入内核(vdso(7)),实测经 vDSO 约 18 ns,绕过 vDSO 直接陷入约 202 ns;
- 在用户态完成:vDSO(virtual dynamic shared object)是内核自动映射到每个进程中的一小段共享代码,在支持的时钟源上,clock_gettime 等调用不再陷入内核(vdso(7)),实测经 vDSO 约 18 ns,绕过 vDSO 直接陷入约 202 ns。经 vDSO 完成的调用不进入内核,也不会出现在 strace 的输出中;
- 内存映射:mmap 把文件映射到用户地址空间,之后直接读写内存,不需要每次调用 read() 和 write(),但缺页时仍会陷入内核(内存映射文件见 [Java IO](Java%20IO.md#内存映射文件));
- 零拷贝(zero-copy):sendfile 在内核中把文件内容直接送到 socket,数据不经过用户缓冲区,read() 和 write() 两次调用也合并为一次(sendfile(2)),Kafka 的 broker 发送消息就是这样做的,见[消息队列](消息队列.md#为什么吞吐量高)。