计算机组成原理-学习笔记17-IO输入输出
计算机组成原理-学习笔记17-IO输入输出
Lecture 17 IO输入输出
- 外围设备:
- 外部设备提供了在外部环境和计算机系统之间的数据交换,通常被称为外围设备(peripheral device),简称为外设(peripheral)。
- 类型
- 人可读设备:适用于与计算机用户通信
- 显示器, 打印机, ……
- 机器可读设备:适用于与设备通信
- 磁盘, 磁带, ……
- 通信设备:适用于与远程设备通信
- 人可读设备:适用于与计算机用户通信
1.IO模块
产生背景
- 不可以将外设直接连接到系统总线上
- 外设操作方法多种多样
- 外设数据传送速度比cpu和存储器慢得多
- 某些外设数据传送速度比cpu和存储器快(反正就是不一样)
- 数据格式和字长度和cpu不同
IO模块是计算机内部系统和外设之间的桥梁。(仍属于计算机系统的一部分)
- 通过系统总线和中央交换器和存储器连接
- 通过专用数据线与一个或多个外设连接
采用统一的接口格式
- 输入/输出模块的接口以控制、状态和数据信号的形式出现
- 与设备相关的控制逻辑控制外设的操作,以响应来自输入/输出模块的命令
- 缓冲器用于缓存输入/输出模块和外设之间传送的数据
- 目的:解决IO太快或太慢
- 缓冲器的大小一般为8位或16位
- 转换器:模拟信号与数字信号
1.1.IO模块的功能
双向通信
- 与处理器通信
- 命令译码: 输入/输出模块接收来自处理器的命令,这些命令一般作为信号发送到控制总线
- 状态报告: 由于外设速度很慢, 所以知道输入/输出模块的状态很重要
- 数据: 数据是在处理器和输入/输出模块之间经由数据总线来交换的
- 地址识别: 输入/输出模块必须能识别它所控制的每个外设的唯一地址
- 设备通信
- 通信内容包含命令、 状态信息和数据
数据缓冲
- 类比银行柜员处理文件,排队
控制和定时
- 原因
- 处理器会非预期的与一个或几个外设进行通信
- 一些内部资源, 如主存和系统总线, 是被共享的
检错
- 检错并把差错信息报告给处理器
- 差错类型
- 设备报告的机械和电路故障
- 传输过程中数据位的变化
1.2.IO模块的结构
大图=小图逆时针转了90°
左侧:状态/控制寄存器用来保存CPU对外设的命令
- 寄存器复用,知道状态才能控制
右侧:有多组外部设备
外部接口(上图左右的细化)
- 串行(用的多):只有一根线用于传输数据,每次只传输一位数据
- 传得远,时钟频率高
- 并行:多根线连接输入/输出模块和外设,同时传送多位数据
- 并行多条线需要保持信息同步(多人走路)
- 当传输速度和总线长度增加时, 总线的时钟频率会受到限制
- 相邻传输间隔时间变长,避免混淆
- 例子
- FireWire: IEEE标准1394串行总线
- USB: 通用串行总线(Universal Serial Bus)
- 更主流,更快
1.3.IO操作技术
编程式I/O:处理器通过执行程序来直接控制I/O操作,当处理器发送一条命令到I/O模块时,它必须等待,直到I/O操作完成
中断驱动式 I/O: 处理器发送一条I/O命令后,继续执行其他指令;并且当I/O模
块完成其工作后, 才去中断处理器工作直接存储器读取(Direct Memory Access,DMA) : I/O模块与主存直接交换数据, 而不需要处理器的干涉
- 仅指数据处理不需要cpu。其他可能要用cpu
编程式IO
当处理器在执行过程中遇到一条与I/O操作有关的指令时, 它通过发送指令到适当的I/O模块来执行这条指令
- 读状态->未就绪 / 就绪 / 出错
- 若就绪,由IO读取字
I/O不会中断处理器, 因此处理器需要周期性地检查I/O模块的状态, 直到发现该操作完成
CPU全程100%投入
IO命令
- 处理器发送一个指定具体I/O模块和外设的地址, 并发送一条I/O命令
- 控制命令: 激活外设并告诉它要做什么
- 测试命令: 测试I/O模块及其外设相关的各种状态条件
- 读命令: 使I/O模块从外设获得一个数据, 把它存入内部缓冲区
- 写命令: 使I/O模块从数据总线获得一个数据, 把它传入外设
IO指令
- I/O指令很容易映射为I/O命令, 并且两者之间通常是简单的一一对应关系
- 编址方式
- 存储器映射式IO:存储单元和I/O设备有统一的地址空间
- pros:能使用大的指令系统,可进行更有效的编程
cons:I/O设备占用地址空间
- pros:能使用大的指令系统,可进行更有效的编程
- 分离式IO:让总线既有存储器的读线和写线,同时也有输入和输出命令线
- 存储器映射式IO:存储单元和I/O设备有统一的地址空间
中断驱动式IO
- 处理器发送一个I/O命令到模块,然后去处理其它有用的工作
- 当I/O模块准备和处理器交换数据时,它中断处理器以请求服务
从IO模块角度:
- I/O模块接收来自处理器的读命令
- I/O模块从相关的外设中读入数据
- 一旦数据进入I/O模块的数据寄存器后, 该模块通过控制总线给处理器发送中断信号
- 对应上方1.2 IO模块的结构
- I/O模块等待直到处理器请求该数据时为止
- CPU可能有更重要的事
- 当处理器有数据请求时, I/O模块把数据传送到数据总线上, 并准备另一个I/O操作
**从处理器的角度来看 **
- 处理器发送一个读命令
- 处理器离开去做其它的事情, 并在每个指令周期结束时检查中断
- 当来自I/O模块的中断出现时, 处理器保存当前程序的现场
- 处理器从I/O模块读取数据字并保存到主存中
- 处理器恢复刚才正在运行的程序的现场, 并继续运行原来的程序
两种状态:中断允许/禁止
- 有时数据过多,需要传送数据时便设为“中断禁止”
- 中断处理时,也是“中断允许”状态
- 可嵌套中断,涉及优先级
响应优先级和处理优先级
- 例子:公交车上抢座位,响应优先级是小伙子腿脚麻利。处理优先级是老太太有让座权
- 存在两个优先级都高的中断源。而高中断源会屏蔽低中断源,只看到更高中断源
- 掩码字:根据处理优先级,表示会不会屏蔽其他中断。1表示屏蔽
- 行屏蔽列
- 主程序的优先级可以看作最低的
- 例子流程:
- 1:主程序
- 2:先中断1(响应优先级)
- 中断关闭,处理保存,中断1开始
- 3:处理完1,恢复主程序(pop栈)
- 4:响应3(push栈3)(响应优先级)
- 5:中断4抢夺3(push栈4)(处理优先级)(3还没动)
- 6:恢复3,对2视而不见(处理优先级)
- 7:恢复主程序
- 8:push2
- 9:恢复主程序
设备识别
例:设备有多个USB插口
多条中断线: 处理器仅仅挑选具有最高优先级的中断线
- 固定优先级
- 即使有多条中断线可用, 每条线上也需要采用其它三种技术中的一种
软件轮询: 模块的轮询次序就决定了模块的优先级
- 轮询顺序决定优先级
- 轮询每一个I/O模块来确定是哪个模块发生的中断
菊花链: 链接模块次序就决定了模块的优先级
- 总线结构决定优先级
- 所有的I/O模块共享一条中断请求线, 中断应答线采用菊花链穿过这些中断模块
独立请求: 中断控制器决定
- 特定的中断控制器用于解码和分析优先级
DMA直接存储器存取
前两种技术的不足
- I/O传送速度受处理器测试和服务设备速度的限制
- 处理器负责管理I/O传送,对于每一次I/O传送,处理器必须执行很多指令
DMA:无需经过处理器即可直接访问内存的模块
解放了CPU,需要另一个硬件去控制
CPU需要通知DMA
- 处理器通过发送以下信息向DMA模块发出命令:读/写、 I/O设备地址、 内存中的起始位置、 字数
- 处理器继续进行其他工作
- DMA模块将全部数据块, 每次一个字, 直接将数据传输到存储器或从存储器读出, 而无需经过处理器
- 当传输完成时,DMA模块向处理器发送一个中断信号
- DMA优先于CPU访问内存,因为IO设备更快
DMA访问法
- CPU停止法
优点: 控制简单
缺点: 影响CPU,没有充分利用内存
适用: 高速I/O设备的块传输(数据连续)
- 周期窃取法
优点: 充分利用CPU和内存,及时响应I/O请求
缺点: DMA每次都请求总线
适用: I/O周期大于存储周期(一波波数据)
- 交替分时访问法(各占一半)
优点: CPU未停止或等待, DMA不请求总线
缺点: CPU周期大于存储周期
DMA配置
(以下方式IO聚合度逐渐提高)
- 单总线分离DMA
- 相当于编程式直接分离CPU
- 单总线集合的DMA-I/O
- DMA成为IO的一部分
- I/O 总线
- 共享DMA
DMA总流程
由此可知:查询传送参数、寻道、查找扇区、校验都需要CPU,DMA只在连续读写发挥作用。
1.4.IO模块的演变
发展趋势:效率提高、模块分离。
2.exam
4/5为重点
本质上是寻址题。分辨有几位端口就是2的几次方
“隐含”并不影响结果
知识点:扫描能使缓存清空。扫描间隔必须小于缓冲区存满的时间
频率(次数) = 1 / 时间
(a)每秒传64kb,中断64x1000/8 = 8k次,共计 8k * 100μs = 800ms,80%
- 1秒(s) =1000毫秒(ms)
1毫秒(ms)=1000微秒 (μs)
1微秒(μs)=1000纳秒 (ns)
1纳秒(ns)=1000皮秒 (ps)
(b)
中断处理 ≠ 中断服务
中断耗时 = 中断处理时间 + 中断服务(题中说“延长”,故增加(16-1)*8μs)
处理间隔变长了
a)直接查询方式
- 夺取总线+交回总线200+200
- IO数据传送与总线数据传送同时进行
- 故有max(128*500ns,128B/400kbs) + 500ns(最后一次一定为总线上)
- ms和ns隔了6次方
- 0.02ms是从?
b)周期窃取
仅计算切换时间和总线传输时间。
IO传输时间2.56ms/128 = 0.02ms为什么不计?
类似题4
- 直接查询方式
- 1GHz=1000MHz = 10^9Hz
- 比较IO传输时间(20μs)与总线传输时间(1000 * 1ns),最后加上总线时间1μs
- CPU占用率一定为100%
- 中断驱动
- a)中断 = 中断请求 + 中断响应 + 中断执行 = 1202周期
- b)每个字节传送时间(IO->CPU->内存,和cpu处理IO无关) + 处理每次中断时间 = 总时间
- DMA
- a)CPU时间只与DMA初始化后处理有关。2000 x 1s x 1000
- b)总时间 = 每个字节传送时间 + DMA挪用时间(1000周期) + DMA处理时间(a中时间)
缓冲区易丢失
a)
- 用缓冲区大小 + 中断处理次数 * 中断处理时间 判断能否中断
- 单位时间最小中断次数 = 数据传输率 / 缓冲区大小
- 总时间 = 最小次数 * 1/时钟频率 * 时钟周期数
b)同比计算
类似PPT例题
- 即使要抢夺,也得先处理响应较快的
- 回归后也不会第一时间被抢夺
- 被屏蔽的中断,需要等待回归主程序,再抢夺主程序
a) 直接查询,条件是查询间隔时间 < 每个字节IO设备传输率
c)中断驱动,条件是响应中断间隔时间 < 每个字节IO设备传输率