这章比前面的章节稍微好理解一些。没有那么多抽象的概念。
I/O 概述
I/O 分层
C high level
在 C high level 中操作的对象是文件句柄。文件句柄是文件系统的抽象。
C low level
C low level 操作的是文件描述符(返回的是数字),从上图可以看到对于标准 stdout,stdin 有固定的文件描述符。
对应的操作有:
这里可以思考一下 sync 的操作符。
system call
这里不做详细介绍。CS162 给的链接看不了。
这个链接可以访问。
https://filippo.io/linux-syscall-table/
file system
在 syscall 之上的文件描述符是一个整型,在 syscall 之下则是一个数据结构。
fs.h 中定义了 kernel 中文件的数据格式。
在 fs 的结构中定义了 f_op 指向当前文件系统(ext3/ext4/ntfs)对应的操作函数。相对于在文件系统之上,抽象了操作方法。
device driver
device driver 又分为 2 层,上层提供常用系统调用,下层连接硬件。
生命周期
通讯
抽象理解 Unix 系统一切皆是文件,通讯也可以理解为文件
client-server 模型
socket
示例:
一旦建立连接,后续的操作就可以看作是文件读写操作。
这个简单的 client-server 存在前置假设:
socket 创建和连接
如果要建立持久连接,需要有不变的内容:
socket 建立:
在 server 端可以看到 server 固定 socket 监听连接消息,然后会创建一个独立的 socket 和 client 连接。
提问的时候,提了一下虚拟机对应不同的 ip,物理对外还是一个 ip。
socket 创建流程:
这里的 server 只创建了一个 socket.而且是 socket server 创建的连接。
socket v2 版本
对应的代码:
因为主进程 wait 子进程的操作,实际上还是只有一个 socket 连接。
socket 并行版本
对应代码:
总结:
本章主要说了两件事:
- I/O 从 C high lower 到 device driver 的生命周期,抽象一切 I/O 都可以理解成文件。
- 基于 client-server 介绍了 socket 连接的方式。