这章比前面的章节稍微好理解一些。没有那么多抽象的概念。

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 并行版本

对应代码:

总结:

本章主要说了两件事:

  1. I/O 从 C high lower 到 device driver 的生命周期,抽象一切 I/O 都可以理解成文件。
  2. 基于 client-server 介绍了 socket 连接的方式。



↙↙↙阅读原文可查看相关链接,并与作者交流