mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-06 02:04:10 +00:00
Update 计算机操作系统 - 概述.md
补充 vDSO 调用不出现在 strace 中的说明。
This commit is contained in:
@@ -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#为什么吞吐量高)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user