news 2026/7/15 20:03:38

《深入理解计算机系统》系统级 I/O

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《深入理解计算机系统》系统级 I/O

《深入理解计算机系统》(CSAPP)的**第 10 章:系统级 I/O(System-Level I/O)**是连接应用程序与操作系统内核的关键桥梁。

这一章的核心在于理解 Unix/Linux 系统中“一切皆文件”的设计哲学,以及如何通过标准的系统调用来高效、可靠地读写数据。它是后续网络编程(第 11 章)和并发编程(第 12 章)的基础。

以下是本章的核心知识体系梳理:


1. Unix I/O 模型

在 Unix 世界中,所有 I/O 设备(磁盘、终端、网络套接字、管道等)都被模型化为文件

核心概念
  • 文件描述符(File Descriptor, fd)
    • 一个非负整数,用于标识进程打开的文件。
    • 标准流
      • 0:STDIN_FILENO(标准输入)
      • 1:STDOUT_FILENO(标准输出)
      • 2:STDERR_FILENO(标准错误)
  • 打开文件表(Open File Table):内核维护的数据结构,包含文件位置指针、引用计数等。
  • V-node 表:包含文件的元数据(如文件大小、权限、指向磁盘块的指针)。
I/O 操作流程
  1. 打开文件(open):内核返回一个 fd。
  2. 读写文件(read/write):内核根据 fd查找打开文件表,执行 I/O。
  3. 关闭文件(close):内核释放相关数据结构。

2. 关键系统调用

openclose
intopen(constchar*pathname,intflags,mode_tmode);// flags: O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND// mode: 仅在创建新文件时使用,指定权限如 S_IRUSR | S_IWUSRintclose(intfd);
readwrite
ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);
  • 返回值实际读/写的字节数。
  • 短计数(Short Count)read可能返回少于请求的字节数(例如遇到 EOF、读取终端行、或被信号中断)。write也可能返回短计数(例如磁盘满或管道缓冲区满)。
  • 重要提示:编写健壮的 I/O 代码必须处理短计数情况。
lseek
off_tlseek(intfd,off_toffset,intwhence);
  • 显式修改当前文件位置。
  • whence:SEEK_SET(开头),SEEK_CUR(当前位置),SEEK_END(末尾)。
  • 注意:普通磁盘文件支持随机访问(seekable),但管道、套接字、终端通常不支持。

3. 稳健的读写:处理短计数

CSAPP 提供了两个辅助函数rio_readnrio_writen(Robust I/O),确保读/写指定数量的字节,除非遇到 EOF 或错误。

// 示例:稳健地读取 n 字节ssize_trio_readn(intfd,void*usrbuf,size_tn){size_tnleft=n;ssize_tnread;char*bufp=usrbuf;while(nleft>0){if((nread=read(fd,bufp,nleft))<0){if(errno==EINTR)// 被信号中断,重试nread=0;elsereturn-1;// 真实错误}elseif(nread==0)break;// EOFnleft-=nread;bufp+=nread;}return(n-nleft);}

4. 带缓冲的 I/O(Standard I/O / Stdio)

系统调用read/write每次都会陷入内核,开销较大。C 标准库提供了带用户空间缓冲的 I/O 函数(fopen,fprintf,fscanf,fread,fwrite)。

  • 全缓冲:缓冲区满或显式刷新时才写入内核(适用于磁盘文件)。
  • 行缓冲:遇到换行符时刷新(适用于终端)。
  • 无缓冲:立即写入(适用于stderr)。

混合使用警告:不要混用低级 I/O (read/write) 和高级 I/O (fread/fwrite) 操作同一个文件描述符,因为它们的缓冲区不同步,会导致数据错乱。


5. 文件共享与重定向

内核数据结构
  • 描述符表:每个进程独立,索引为 fd。
  • 打开文件表:所有进程共享,包含文件位置、引用计数。
  • V-node 表:所有进程共享,包含文件元数据。
dup2函数
intdup2(intoldfd,intnewfd);
  • 复制文件描述符。如果newfd已打开,先关闭它。
  • 用途:实现 Shell 的重定向(>,<,|)。
    • 例如:ls > out.txt
      1. 父进程fork
      2. 子进程open("out.txt", ...)得到 fd 3。
      3. 子进程dup2(3, 1),将标准输出(fd 1)重定向到文件。
      4. 子进程close(3)
      5. 子进程execve("ls", ...)

6. 标准 I/O 的局限性

虽然stdio方便,但在以下场景不适用:

  1. 网络编程:套接字是字节流,没有明确的“行”或“文件结束”,且需要非阻塞 I/O。
  2. 二进制数据stdio主要面向文本,处理二进制数据时需小心格式转换。
  3. 性能敏感场景:用户空间缓冲可能带来额外的拷贝开销。

因此,网络服务器通常直接使用read/write或更高级的异步 I/O 接口。


7. 本章核心实验:Shell Lab 的延续 & Proxy Lab 预备

  • Shell Lab:你需要利用dup2实现输入/输出重定向和管道。
  • Proxy Lab:你将构建一个 Web 代理服务器,需要大量使用read/write来处理 HTTP 请求和响应,并处理并发连接。

总结

系统级 I/O 是 Unix 编程的基石。关键点包括:

  1. 文件描述符是 I/O 的核心句柄。
  2. 短计数是正常现象,必须通过循环处理。
  3. 内核数据结构(描述符表、打开文件表、V-node)解释了文件共享和重定向的原理。
  4. dup2是实现 Shell 重定向和管道的关键。
  5. 理解带缓冲 I/O系统调用 I/O的区别及适用场景。

掌握这些内容后,你就具备了编写网络服务器和处理复杂文件操作的能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 20:00:36

数据结构实战:基于路径回溯法求解二叉树最近公共祖先(LCA)

1. 什么是二叉树的最近公共祖先&#xff1f;最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;简称LCA&#xff09;是二叉树中两个节点的最低共同祖先节点。举个例子&#xff0c;假设我们有一棵家族树&#xff0c;你想找出两个人的最近共同祖先&#xff0c;这个祖先…

作者头像 李华
网站建设 2026/7/15 19:56:09

智慧校园综合管理平台一套多少钱?详解三大成本与预算

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

作者头像 李华
网站建设 2026/7/15 19:56:07

DRA821U高速接口时序参数深度解析与硬件设计实战

1. 项目概述与核心价值在汽车电子和工业嵌入式系统的硬件设计里&#xff0c;时序参数表往往是那份最让人又爱又恨的文档。爱它&#xff0c;是因为它白纸黑字地定义了芯片能否正常工作的电气边界&#xff1b;恨它&#xff0c;是因为这些密密麻麻的数值和图表&#xff0c;如果没有…

作者头像 李华
网站建设 2026/7/15 19:55:55

REAPER作为对话系统实时音频中枢的工程实践

1. 项目概述&#xff1a;当音频工作站遇上对话智能——REAPER不是用来做聊天机器人的&#xff0c;但偏偏能做得更扎实“Let’s make chatbots smarter using REAPER”——这个标题乍看像一句玩笑话&#xff0c;甚至有点违和&#xff1a;REAPER是专业音频工作站&#xff08;DAW&…

作者头像 李华
网站建设 2026/7/15 19:54:13

优惠券APP的分布式锁选型与性能调优:Redisson vs Zookeeper实战比较

优惠券APP的分布式锁选型与性能调优&#xff1a;Redisson vs Zookeeper实战比较 大家好&#xff0c;我是省赚客APP研发者微赚淘客&#xff01; 在电商导购和优惠券分发的业务场景中&#xff0c;高并发是常态。特别是在“双11”或“618”大促期间&#xff0c;用户抢购限量优惠…

作者头像 李华