系统互连与 I/O 设备
本章主要介绍外部设备和计算机系统的交互逻辑。这里的外部设备包括输入输出设备 (I/O 设备) 以及外部存储。
数据校验
数据在信道传送的过程中,可能会因为各种噪声或者硬件原因出现错误,我们有必要进行数据的检错与纠错。通俗来说就是我们想知道数据在传输的过程中有没有发生变化以及如果发生了变化我们应该如何纠正这个错误变化。本目我们只学习数据传输过程中的错误检测,具体的叫做「奇偶校验法」策略。
在开始学习具体的错误检测方法之前,先看一下数据校验的流程图来对其有一个全局的把握:
如上图所示,对于原始数据 M,我们想知道其在经过各种期间和总线之后有没有发生异变,显然我们可以将 M 的副本一起传送,但这样的开销就直接变成了两倍,因此尝试用一个存储开销更小的东西来作为原始数据 M 的一个唯一表示,即校验码。数据传输的过程中,我们将原始数据和校验码一起传输,最后通过比对原始数据的校验码以及最后数据的校验码来判定是否发生了数据传输的错误。
具体的。对于偶校验法。我们将校验码取作原始数据 \(M\) 所有二进制位的异或,此时校验码只有一位,因此也被称为校验位 \(P\)。现在 \((M,P)\) 开始传输,经过了各种存储器和总线后我们将其表示为 \((M',P'')\)。我们想知道此时的 \(M'\) 和之前的 \(M\) 是不是同一个东西,怎么办呢?重新拿 \(M'\) 计算一次校验位得到 \(P'\),比较 \(P''\) 和 \(P'\) 是否相同即可,如果相同,我们就认为数据传输没有发生问题,如果不相同那么数据传输就发生了问题,需要对 \(M'\) 纠错后再输出。奇校验就是在用原始数据的每一位计算异或值后,再异或一次 \(1\)。
这合理吗?显然不具备绝对正确性。但奇偶校验强就强在逻辑很简单,并且对于硬件的开销很小,毕竟只多传输了 1 位。反例如下:
- 首先我们不能保证校验码传输前后是否会发生错误;
- 其次针对校验逻辑,奇偶校验都不能检测出偶数位数据传输错误,并且,如果校验位前后不同则表明数据传输的过程中一定发生了错误,但是不能知道多少位 \((1,3,5,...2n-1)\) 发生了错误,并且也不知道哪几位发生了错误,也就没办法进行后续的数据纠错。
码距是什么?所谓码距就是两个二进制代码(码字)中不同位的个数。在奇偶校验的码制下,两个合法码字的最小码矩就是 \(2\)。
参考:什么是奇偶校验原理?奇校验、偶校验、校验位(单比特奇偶校验、两维奇偶校验(矩阵校验或交叉奇偶校验))
I/O 设备
主要有:输入输出设备、外部存储设备、网络设备三类设备。其中外部存储设备就是第七章存储器中的外存部分。
I/O 接口
一般而言,设备通过接口与南桥芯片相连来减少 CPU 的布线压力,主板中的数据通过名为总线的线路进行数据传输。这里的接口指的是设备与芯片的中间硬件,起到一个数据缓冲的作用。既然起到缓冲,就需要存储数据,也就对应了需要存储器,接口中的存储器一般都是寄存器,被称为端口。
I/O 传输
设备与内存的数据传输有三种方式:
- 程序查询方式(OS 主动轮询)。操作系统定时从设备读取数据;
- 程序中断方式(设备主动请求)。设备主动向 CPU 发送数据传送的中断请求,OS 通过执行中断程序来让设备与内存进行数据交互;
- DMA 方式(即 Direct Memory Access 成批传输数据)。在传输的数据量较大时,接口的缓冲区需要多次接受数据进行传输,而缓冲区每一次数据传输都需要向 CPU 发送「请求总线」和「完成传输」两次中断请求,这就意味着在传输的数据量很大的情况下,CPU 需要花很多计算代价来处理 I/O 操作。为了降低 I/O 的开销,设计者设计了 DMA 接口来控制大批量数据的传输。具体来说,DMA 接口中有一个 DMA 控制器,其只需要在一开始向 CPU 发送「请求总线」的中断请求,以及在最后向 CPU 发送「完成传输」的中断请求,期间可以自主的让外设与内存进行数据交互,而无需再使用 CPU 的计算资源。这种方式有一种 ”多核“ 的思想在里面。