I/O Systems
约 1494 个字 6 张图片 预计阅读时间 10 分钟
I/O硬件
基本组成
- Port:端口,每一个设备都有自己的port number,根据每个设备的port number进行区分
- Bus:总线,设备通过总线相连
- Controller:设备上的芯片,通过bus和主机使用一些规定好的协议进行通信交互
通信方式
- Special I/O instructions:设备发出特殊的指令进行通信
- Memory-mapped I/O(更加常见):设备中的寄存器与内存中的一段逻辑地址进行映射,这样主机可以使用访问内存的方式对设备内容进行访问[可以和正常内存共享空间,也可以开辟一块独立的空间,现在一般使用前一种方式]
一种PC Bus的结构
和memory直接相连的是北桥(速度较快),一般使用拓展总线连接键盘这种交互频率较低的外部设备,然后拓展总线再连接到南桥上,南桥还负责电源管理等工作
不同控制器对应的端口
I/O端口的寄存器
- Data-in: read by the host to get input
- Data-out: written by the host to send output
- Status: device status read by the host
- Control: written by the host to start a command or change the mode of a device
in和out是相对于CPU而言的
Polling(轮询)
- 主机反复读取忙位,直到该位变为清除状态。
- 主机在命令寄存器中设置写位,并将一个字节写入数据输出寄存器。
- 主机设置命令就绪位。
- 当控制器注意到命令就绪位被设置时,它设置忙位。
- 控制器读取命令寄存器并看到写命令。它读取数据输出寄存器以获取字节,并对设备执行I/O操作。
- 控制器清除命令就绪位,清除状态寄存器中的错误位以指示设备I/O成功,并清除忙位以指示操作完成。
Interrupts(硬件中断)
- CPU中断请求由I/O设备触发
- 中断处理程序接收中断(可屏蔽以忽略或延迟某些中断)
- 使用中断向量将中断分派到正确的处理程序
- 基于优先级
- 有些中断可以被屏蔽,有些中断不能被屏蔽nonmaskable(电源故障等)
- 中断链:用于处理比中断向量元素更多的设备,每个列表上的处理程序依次被调用。
- 中断机制也用于异常
多种中断程序
- 低优先级中断可以被高优先级中断抢占。
- 示例用法:高优先级处理程序
- 记录I/O状态
- 清除设备中断
- 启动下一个待处理的I/O,并引发低优先级中断以完成工作
- 稍后,低优先级处理程序
- 通过将数据从内核缓冲区复制到应用程序空间来完成用户级I/O,并调用调度程序将应用程序放置在就绪队列中
- 示例用法:高优先级处理程序
trap(由软件触发的中断)一般认为优先级是不高的。
DMA(Direct Memory Access)
需要DMA控制器。绕过CPU,直接在I/O设备和内存之间传输数据
要求读入的是连续的blcok,并且会放到内存中的连续空间中
当传输完全完成之后,才会告知CPU进行其他的工作
应用I/O接口
I/O系统调用将设备行为封装在通用类别中,设备驱动程序层隐藏了内核中I/O控制器之间的差异。
和API正好相反
内核I/O结构
kernel I/O subsystem负责将下层的不同结构进行封装
Block and Character Devices
- 块设备包括磁盘驱动器
- 命令包括读、写、寻道
- 原始I/O或文件系统访问
- 可以进行内存映射文件访问
- 字符设备包括键盘、鼠标、串行端口
- 命令包括获取、放置
- 顶层的库允许行编辑
Network Devices
网络设备可以认为是高速设备,既需要读,又需要写,一般通过套接字实现数据的交互。
底层会有别的网络设备进行支持(网卡提供相关操作)。
Clocks and Timers
提供时间信息以及时间中断等
Blocking and Nonblocking I/O
- 阻塞 - 进程在I/O完成之前被挂起
- 易于使用和理解,但是不足以满足某些需求
- 非阻塞 - I/O调用返回尽可能多的可用数据
- 用户界面,数据复制(缓冲I/O)
- 通过多线程实现,有多个不同的控制流
- 快速返回已读取或写入的字节数(读出来的数据量可能并不是自己需要的数据量)
- 异步 - 进程在I/O执行时运行(返回时不一定在调用的流里面)
- I/O子系统在I/O完成时通知进程
内核I/O子系统
- 调度
- 通过每个设备的队列进行一些I/O请求排序(磁盘调度)
- 一些操作系统尝试公平性
- 缓冲 - 在传输过程中在内存中存储数据(I/O的速度相较于CPU的速率很低)
- 以应对设备速度不匹配,例如从调制解调器接收数据到磁盘(双缓冲[一个负责写数据,另一个负责读数据])
- 以应对设备传输大小不匹配,例如网络数据包
- 为了保持copy semantics(当写系统调用指定一个缓冲区来存储数据,并在系统调用之后修改其内容),也就是在正式使用之前进行空间预留
- 缓存 - 快速内存保存数据的副本
- 假脱机Spooling - 为设备保存输出,使得主机不会在设备输出时停摆
- 在设备一次只能处理一个请求的情况下使用
- 设备保留 - 提供对设备的独占访问:用于分配和释放的系统调用,但是需要注意死锁