I/O 系统调用 (I/O System Call) 是用户程序请求操作系统内核执行数据读写操作的标准接口。
核心逻辑
由于安全限制,用户程序无法直接访问硬件(磁盘、网卡)。必须通过系统调用陷入内核态,由内核代为执行。
- 特权切换:触发软中断,CPU 从 用户态 (User Mode) 切换到 内核态 (Kernel Mode)。
- 上下文切换:内核保存当前进程寄存器状态,执行 I/O 操作后再恢复。
- 数据拷贝:通常涉及数据在“内核缓冲区”与“用户缓冲区”之间的复制。
常见调用
| 调用 | 功能 | 场景 |
|---|---|---|
read | 从 文件描述符 读取数据 | 读取文件、接收网络包 |
write | 向文件描述符写入数据 | 写入磁盘、发送网络包 |
open | 获取文件描述符 | 准备操作某个资源 |
close | 释放文件描述符 | 结束资源占用 |
极简流程
sequenceDiagram participant U as 用户程序 participant K as 内核 (Kernel) participant H as 硬件 (Disk/Net) U->>K: read(fd, buf) [系统调用] K->>H: 读取数据 H-->>K: 返回数据 K->>U: 拷贝数据到 buf 并返回
系统调用是昂贵的。频繁的调用会导致大量的上下文切换,这也是为什么高性能架构(如 Redis)会尽量减少系统调用或使用批量处理。