《汇编程序设计与计算机体系结构:软件工程师教程》 —2.4 输入与输出

举报
华章计算机 发表于 2019/12/04 11:43:47 2019/12/04
【摘要】 本节书摘来自华章计算机《汇编程序设计与计算机体系结构:软件工程师教程》一书中第2章,第2.3节,作者是布莱恩·R. 霍尔(Brian R. Hall)[美] 凯文·J.斯隆卡(Kevin J. Slonka),爱飞翔 译。

2.4 输入与输出

目前为止,我们已经讨论了处理器中的某些细节,并且知道了它是怎样与主板中的其他主要部件相通信的。然而还有一个问题是处理器如何与外部设备进行通信。键盘、显示器、网卡等外部设备需要通过 I/O 模块(Input/Output Module)与电脑相连,而这些 I/O 模块同时也与系统总线相连,使得外部设备能够与计算机中的其他组件(例如 CPU)通信。除了在处理器与外部设备之间提供缓冲通信(buffered communication)机制之外,I/O 模块还可以完成其他一些重要的操作,例如传输数据、对命令进行解码,以及查询设备状态等。

处理器需要用控制器来精准地安排指令的执行工作,使指令之间不会互相干扰。与之类似,I/O 模块也必须设法在计算机内部的组件与连接到该模块的外部设备之间协调使双方能够有效沟通。前面说过,离 CPU 越远的设备速度越慢,由于外部设备正是计算机环境中离 CPU 最远的设备,因此它们的速度是最慢的。由于速度不同,I/O 模块必须提供数据缓冲区,使 CPU 的工作速度不会因为外部设备而受到影响,同时也令外部设备不会为 CPU 发来的大量数据所淹没。而且不同的外部设备其速度也有所区别(例如用刻录机刻录光盘的速度就与往优盘上复制数据不同),因此每个 I/O 模块都需要考虑与之相连的设备具有怎样的数据传输率,并据此做出调整。

      学习指南:错误检测与修正算法有很多种,例如校验和、循环冗余校验(Cyclic Redundancy Check,CRC)、汉明码(Hamming Code)以及奇偶校验位(parity bit)等,你可以在网上搜索相关的资料并深入研究。

 

I/O 模块的另一项关键工作是检测错误,也就是确保外部设备所接收到的数据与发送方所发送的数据是一致的。检测错误的办法有很多种,但目标都一样,就是确保数据准确无误。

处理器执行 I/O 操作通常可以采用 4 种方式:程序 I/O(Programmed I/O,PIO)、中断驱动 I/O(Interrupt-driven I/O)、直接内存访问(Direct Memory Access,DMA)以及 I/O 通道(I/O Channel)。在这 4 种方式中,程序 I/O 实现起来最简单,然而开销也最大,因此它是效率最低的方案,如图 2-13 所示。处理器在以 PIO 模式执行 I/O 操作时,首先需要向相关的 I/O 模块下达命令并等待回应。I/O 模块负责执行该命令并在执行完毕时把 I/O 状态寄存器中的相关二进制位设置好,以便告知处理器这条命令已经执行完了。处理器会定期检查 I/O 状态寄存器,看 I/O 模块有没有把这项操作执行完。这种定期查询的做法开销很大,在执行耗时较长的 I/O 操作时更是如此,因为处理器必须多次查询才能知道这项操作有没有执行完。

 image.png

图 2-13 程序 I/O

如果处理器向 I/O 模块发送完命令之后不在那里干等着该命令执行完而是去执行其他操作,那么效率可能会高一些。这就是中断驱动 I/O 所采用的理念,如图 2-14 所示。处理器向 I/O 模块下达完命令之后就去执行别的指令了,只有当 I/O 模块发出中断请求时,它才会回过头来继续处理这项操作。中断会使处理器暂停其他的操作,先把早前未处理完的这项 I/O 操作执行完。由于处理器在每个指令周期的末尾都要检测中断,因此I/O 模块在发出请求中断的消息之后,最多只需等待 1 个完整的指令周期就可以令相关的事务得到 CPU 的处理。I/O 模块在执行命令时几乎用不着处理器来干预,只是每次把数据写入主存,或是从主存中读取数据的时候需要与处理器相配合。

 image.png

图 2-14 中断驱动 I/O

程序 I/O 与中断驱动 I/O 这两种处理方式均要求处理器必须全程参与,但由于很多 I/O 操作仅仅是在外部设备与 RAM 之间单纯地传输数据,因此这会令处理器把许多时钟周期都浪费在这种简单的任务上。为了避免浪费,我们可以采用图 2-15 所描述的这种方式来处理 I/O,这就是直接内存访问(Direct Memory Access,DMA)。该模式要求主板上必须有专门用来执行 DMA 操作的模块。当处理器需要执行 I/O 操作时并不把信息直接发送到设备的 I/O 模块,而是发给刚才说的这个 DMA 模块。此模块会在某种程度上模仿 CPU 的处理方式,它每次令 CPU 暂停一个周期从而获得 I/O 操作的控制权,以便不受限制地访问系统总线(这种行为叫作周期挪用,cycle stealing)。DMA 模块执行完 I/O 操作之后,向处理器发送中断请求以便通知后者。处理器只需把 I/O 操作中不涉及数据传输的那部分指令执行完即可,这样可以节省很多时钟周期,令计算机得到更为有效的利用。

 image.png

图 2-15 直接内存访问

DMA 模块看上去似乎解决了 CPU 必须花很多时间处理 I/O 操作这一问题,但实际上它并不是个完整的处理器,因此,必须挪用 CPU 的周期才能完成 DMA 任务。由此可见,与理想状况相比,CPU 还是会做一些工作。为了把周期挪用问题也解决掉,我们可以拿真正的处理器配置一个专门用来处理 I/O 操作的模块。这种技术叫作 I/O 通道,它使得该模块无须再挪用 CPU 的周期来执行任务。此技术有很多种形式,其中一种是每次只处理一台设备的 I/O操作,还有一种是同时处理很多台设备的 I/O 操作(这也称作 multiplex)。有了 I/O 通道,CPU 就不用处理那么多指令了。它只需要把最开始的那条指令告诉该通道,此后就由这个通道来接管并控制 I/O 模块,令其按照剩下的指令去完成 I/O 操作,而无须再占用 CPU 的周期。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。