I/O系统
操作系统IO功能是:管理和控制IO操作和IO设备
设备驱动程序为IO子系统提供了统一的设备访问接口,就像系统调用为应用程序与操作系统之间提供了标准接口
IO硬件
设备与计算机的通信通过一个连接点或端口。如果设备共享一组通用线路,那么这种连接称为总线
- 菊花链:A通过线路连到B,B连到C,C通过端口连到计算机。菊花链通常按照总线运行
图示
构成
-
PCI总线
- 常用于PC系统总线
- 将处理器内存子系统连到快速设备
-
扩展总线
- 连接相对较慢的设备,如键盘和串口和USB端口
-
小型计算机系统接口(SCSI)
- 通常连接SATA磁盘
-
控制器
- 可以操作端口、总线或设备的一组电子器件;里面有寄存器;设备控制器可发送中断给CPU,告知CPU IO已经完成
-
其他总线
- 用于互连计算机主要部分的其他总线包括,吞吐量高达16GB/s的PCI Express和吞吐量高达25GB/s的HyperTransport
- 新一代的高速总线技术相继出现了。大多数是基于高速串行构架产生的传输标准。包括HyperTransport, InfiniBand, RapidIO,ARM架构中的AMBA和StarFabric等等。这些均有业界的不同企业支持,背后也都有大量的资金投入标准的研究开发,所以每一标准都声称自己与众不同,独占优势。主要的差异在于可扩展性、灵活性与反应时间、单位成本的取舍平衡各不相同。
原文链接:https://blog.csdn.net/pankul/article/details/8642030
IO端口四种寄存器
-
状态寄存器
- 保存状态数据,CPU可以从中读取当前接口电路的状态,其状态间接反映了外设的状态
-
控制寄存器
- 保存控制数据,CPU可向其中写入命令,选择接口电路的工作方式,并控制外设进行有关操作。
-
数据寄存器
- 数据输入寄存器
- 数据输出寄存器
- 在输入时,它保存从外设发往CPU的数据;
在输出时,它保存从CPU发往外设的数据
IO操作
https://www.cnblogs.com/niuyourou/p/12588407.html
轮询
- 定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作
- 程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用
中断
-
中断,便是设备控制器向处理器发出的中断,可以想象数据交互的过程:
1. 处理器需要磁盘上的 100M 数据,于是向磁盘处理器发出读取指令,然后进程阻塞,等待数据准备完毕。
2. 磁盘处理器接收到读取指令,执行寻道/寻址等磁盘操作找到目标数据,将数据读取到磁盘处理器的寄存器中。假设寄存器容量为 1M ,等待寄存器读满后向 CPU 发出中断。
3. CPU 接收到中断信号,唤醒进程执行数据读取指令,将数据从磁盘控制器的寄存器读取到内存。等待读取完成,没有数据可读取,继续进入阻塞状态。
4. 磁盘控制器再次将磁盘中的数据读取到寄存器,又是 1M ,再次向 CPU 发送中断。循环往复,直到将 10 M 数据读取完成。
可以看到,总体的优化思路是通过中断机制,将设备控制器从设备中读取数据到寄存器的时间节省了出来,CPU 不会繁忙等待在这段时间上,可以去做其它有意义的事情。
- 频繁的中断会加大 CPU 的压力,尤其是一些设备控制器的寄存器比较小的情况下,一次 I/O 操作中进行中断的频率非常高。另外将数据由设备处理器读取到内核缓冲区的过程 CPU 是全程干预,一个字节一个字节进行读写的,这些操作并没有什么复杂的逻辑,由 CPU 直接处理显得有些浪费资源
DMA(Direct Memory Acess)
-
直接内存存取技术是指,数据在内存与I/O设备间直接进行成块传输。该技术基于 DMA 设备,将 CPU 从简单的数据传输工作中解放了出来
-
DMA工作过程
- ⑴当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。
- ⑵发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起,进程进入阻塞状态。进程调度程序调度其他进程占据CPU。
- ⑶输入设备不断地窃取CPU工作周期(或者说与 CPU 争取内存总线),将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。
- ⑷DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。
- ⑸中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行
通道IO
应用程序IO接口
按统一的标准的方式来处理IO设备
操作系统提供了统一的接口,而各种设备的驱动程序自己实现如何驱动硬件,然后通过与操作系统接口的对接来向上层提供服务。这样,操作系统无需为每个设备都做针对性的驱动。各方只要根据标准走
IO的各种差异
-
字符流或块
-
字符流设备逐个字节传输,而块设备以字节块为单位来传输
-
键盘鼠标按流
- get(),put()
-
磁盘按块
- write(),read(),seek()
-
-
-
顺序访问或随机访问
-
同步或异步
-
共享或专用
- 共享值被多个进程或线程并发使用
-
操作速度
- 每秒传输多少字节
-
读写、只读、只写
网络设备
- 套接字Socket接口
- 函数select()可以管理套接字,可以消除轮询和忙等
时钟与定时器
- 网络阻塞产生的 指数退避 就可以用定时器实现
向量IO
https://www.eejournal.com/article/20170209-scatter-gather/
-
分散聚集(scatter-gather)
-
理想情况
-
实际情况
-
分散聚集:所需的数据在内存中是分散的,我们要对它们进行一次性的处理,那么就可以把它们聚集在一起,处理完成后,若有需要则把它们分散回原来的位置
内核IO子系统
IO调度
-
磁盘调度算法有其不合理性,我们可以重新排列服务顺序来提升IO效率
-
当内核支持异步IO时,它必须能同时跟踪许多IO请求。为此,操作系统可能会将等待队列附加到设备状态表(device-status table),内核负责管理它。
- 每个条目表明设备的类型、地址和状态
缓冲
-
缓冲区是一块内存区域,用于保存在 两个设备 或 设备和应用程序 之间传输的数据
-
3
-
处理数据流的生产者和消费者之间的速度不匹配
-
协调传输大小不一的数据的设备
-
支持应用程序IO的复制语义
- 复制语义是什么意思?
就是从缓冲区把数据调用write()写入到磁盘后,不管在这之后你缓冲区里面的数据有没有改,我磁盘都只会跟你write()时的数据一致 - 通过虚拟内存映射 和 写时复制 可以得到同样的效果
- 复制语义是什么意思?
-
缓存
- 缓存是保存数据副本的高速内存区域。访问缓存副本比访问原版更加有效
假脱机与设备预留
- 假脱机打印允许暂时将从计算机传送来的打印作业临时保存起来,并在计算机完成传送后打印他们。
这样可缩短打印时间,因为可最大限度地提高打印机的效率 - 有的设备不能实现复用多个并发应用程序的IO请求,那么这个时候就要OS提供支持设备的互斥访问,应用程序自己来避免死锁
错误处理
-
重试
-
返回错误代码
-
SCSI设备故障级别
有点类似于java里面log的打印输出级别
-
感应键:用于标识故障的一般性质,如硬件错误或非法请求
-
额外感应代码
- 故障类型,如错误命令或自检失败
-
额外感应代码修饰词
- 更详细的信息
-
IO保护
- 为了防止用户执行非法IO,我们定义所有IO指令为特权指令。因此用户态不能执行IO指令,只有内核态可以
- 内存保护系统保护任何内存映射和IO端口内存位置,以便阻止用户访问。内核会提供一种锁定机制,允许内存的一部分一次性分配给一个进程