From d1d0a64068cfcca0730e649f6bb18ab58b5d457b Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Mon, 2 Nov 2026 01:31:14 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E8=AE=A1=E7=AE=97=E6=9C=BA=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E7=B3=BB=E7=BB=9F=20-=20=E6=A6=82=E8=BF=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充 vDSO 调用不出现在 strace 中的说明。 --- notes/计算机操作系统 - 概述.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/计算机操作系统 - 概述.md b/notes/计算机操作系统 - 概述.md index a2c3aa59..96c48284 100644 --- a/notes/计算机操作系统 - 概述.md +++ b/notes/计算机操作系统 - 概述.md @@ -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#为什么吞吐量高)。