106-计算机输入和输出
# 106-计算机输入和输出
如果无法与外界进行联系,计算机的 CPU,存储器再强大也没有任何的用处。 因此我们需要在我们的模型机上加上输入与输出,这才能构成一个完整的计算机模型。
这就是冯·诺依曼计算机的五大组成部分 分别是运算器、控制器、存储器、输入设备和输出设备。 现在我们就主要来介绍输入设备和输出设备。 根据冯诺依曼结构的要求,计算机要执行 的程序首先需要通过输入设备传送到存储器中 那么这个过程是如何完成的呢?
就让我们来看一看冯诺依曼这个时代所用的计算机。 当时编写程序并不像我们现在这样方便 ,程序员需要在长长的纸带上打上小孔 ,若干个小孔就代表一条指令,那么将这样穿孔的纸带送入计算机后 计算机可以通过有孔或者没孔的区别转换成 0 和 1 的二进制信息, 从而识别出程序员所表达的指令。经过运算以后,计算机将通过电传打字机将输出的结果打印在纸带上。 这样人们就可以通过观察,分析纸带上的穿孔情况来判断输出的结果。那这样的计算机的输入和输出,与冯诺依曼结构又是如何对应呢?
我们先来想,这个穿孔纸带应该对应着什么,是对应着输入设备吗? 其实纸带上的信息还是要通过特定设备才能被识别。 所以穿孔纸带应该是作为输入设备的来源。其实在冯诺依曼结构中,对此也进行了规定。 除了输入设备 I,输出设备 O ,冯诺依曼结构中还规定了外部的记录介质,称为 R ,实际上穿孔纸带就是这种外部记录介质。 它可以静态的存储计算机所需的信息。 不会因为计算机断电而丢失。
那好,刚才提到了电传打字机。有属于哪个类别呢? 其实电传打字机应该属于输出设备的一种。 电传打字机会将计算机的运行结果打印到纸带上 所以电传打印机输出的纸张也可以认为是外部记录介质 R。 除了纸张,还可以用带磁性的材料 存储信息。类似于我们现在使用的硬盘。
那么硬盘应该属于输入设备、输出设备 还是外部记录介质? 首先我们看硬盘是可读又可写的。所以我们至少应该是这么连接的 而硬盘中的信息在断电之后是不会丢失的 ,所以硬盘也具有外部记录介质 R 的特性。 所以来说严格,硬盘里记录信息的磁片才是真正的外部记录介质。 而硬盘当中还会有其他的控制芯片, 可以认为是输入或者输出设备的一部分。 在通常情况下我们没有必要划分的那么苛刻 ,可以认为硬盘就是属于外部记录介质 R 这种类型。
那么现在的计算机当中 很多设备都会既有输入的功能又有输出的功能。 所以通常我们会这么来画这个结构图 将输入设备和输出设备化成一个部件,既有输入的功能又有输出的功能。
现在,我们就来看 如何在我们的模型机上添加这样一个输入输出设备。 如果直接考虑硬盘这样的设备,就太过复杂了。 我们希望现在模型机上添加一个简单的输入输出设备。 说到简单的设备,我们先来看一个小故事。 这是爱德华·罗伯茨, 当他 60 年代从军队退役之后,开了一个小公司, 制造和销售台式的计算器。 但是后来由于德州仪器这样的大公司进军计算机的市场,采用了 低价销售的策略,罗伯茨这样的小公司自然无法抵抗。很快就到了破产的边缘。 为了挽救这样的局面,罗伯茨也苦苦思索了很多办法。其中一个办法就是设计制造 面向个人的计算机。虽然但是计算机已经开始小型化了, 但是那是,所为小型计算机的体积仍然很大。不是个人能够轻易搬动的。 而且动格上万美元的价格,更不是个人所能承受的。 而大众电子杂志的编辑跟罗伯茨说 如果你能做出 400 美元以下的计算机,我就在杂志封面上给你做推荐。
后来罗伯茨真的造出了这样的计算机,那就是牛郎星 8800 。它内部主要有两块集成电路:一是 intel8080 微处理器 ,二是一块 256 字节的存储器。
那么他在面板上提供了简单的输入输出 靠手来上下拨动一些开关进行编程输入 计算机在经过运算之后,会将计算的结果通过 这些小灯泡进行显示。虽然构造简单, 但这确实是一台设计精巧,而且有实用价值的计算机。 更重要的是它价格非常便宜。真的做到了 400 美元以下。 于是,大众电子杂志就在 1975 年 1 月 真的为他做了封面的推荐。 此后,订单像雪片一样地飞来。挽救了罗伯茨的公司。
当时,很多电子计算机的爱好者和团体都争相采购 牛郎星 8800 型计算机以进行分析研究。 其中就有乔布斯和他的搭档沃兹尼亚克。 他们一方面认真学习了这台计算机精巧的内部结构, 另一方面,他们也对如此简陋的输入输出感到非常不满意。 在这样的影响下,同一年,他们就很快设计完成了自己的产品。 就是苹果 I 型个人计算机。这台计算机有键盘的输入 并且可以连接电视机作为显示器输出。这也是苹果公司的第一个产品。
那好,我们回来看如何在模型机上添加输入输出设备。 我们不需要那么复杂的输入输出。 现在,我们只想添加一个类似于牛郎星 8800 型计算机的输入和输出 也就是手动的开关和小灯泡的显示。 我们可以设想有一个类似于存储器结构的输入输出芯片。它内部有两个单元,每个单元都有自己的地址。我们这里设定的是 1110 和 1111 这两个地址。 他们和存储器里面的地址都不相同。因此可以相互区分。 那这个输入输出如何与计算机的其他部分相连呢? 我们知道 CPU 是通过控制总线,地址总线和数据总线与存储器相连的。 现在我们就来对此做一个简单的改造。 将控制总线分别连接到存储器和输入输出芯片的控制逻辑,地址总线也同样分别连到这两个部件。数据总线也是如此。
然后我们将输入输出设备中其中一个单元,连接到手动的开关,这个单元中有 8 个比特, 每个比特连接一个开关。 当开关拨动到上方时,对应的位就会被设置为 1。开关拨动到下方时, 对应的位就会被设置为 0。另外一个存储单元接到 8 个小灯泡, 当这个单元中的比特为高电频时,对应的小灯泡就会亮起。 如果这个比特是低电频时,对应的小灯泡就会熄灭。
那现在我们就有一个非常简单的输入输出。 那这个输入输出在计算机上是如何工作的呢? 我们通过一个简单的输入的场景来进行学习。 我们假设这时候 CPU 和存储器已经开始工作了。 其中一条指令就是要读取这 8 个手动开关的状态。 假设现在 8 个手动开关的状态 是前三个开关被拨到高位,后五个开关被拨到低位 那地址为 1111 这个单元中所保存的 2 进制信息就是这样的。 那 CPU 如何能读取到这个输入信息呢? 我们首先来看地址总线。CPU 会将地址发送到地址总线,发的地址是 1111,那么在总线上会有一些简单的电路进行地址的识别, 可以发现这个地址应该发到输入输出部件,而不是存储器。
与此同时,我们来看控制总线。 CPU 会发出读的信号, 从而告知输入输出设备目前是要进行一个读操作, 那输入输出设备的控制逻辑和地址译码器 就会从地址为 1111 的单元中读出相关的信息, 送到数据总线上。 数据总线会将这个数据最终送回到 CPU 中, 这样就完成了输入信息的读取工作。
此后,CPU 可以对这个输入的数据 进行运算,或者根据这个数据调整后面的执行的行为,也可以把这个数暂时保存到存储器中以备后来的使用。 那这样就是一个输入的简单场景。
然后我们再来看一个输出的简单场景。 既然是输出,我们就要给出输出单元对应的地址, 在这里是 1110,与刚才一样, 地址总线会将这个地址传送到输入输出设备, 同时,控制总线上回给出写的控制信号, 然后在数据总线上, 会给出我们想输出的数据, 这里设为 1100 1100. 然后输入输出设备就会根据来自总线的信息判断出要向地址为 1110 的单元写入数据 1100,1100, 此后就可以完成写入的操作。
当写入操作完成后,对应的小灯泡就接收到了 高低不同的电压,我们就会发现 1 所对应的灯泡亮起, 0 所对应的灯泡熄灭。这就是一个输出的简单场景。 这样我们就将 CPU,存储器 输入输出设备通过系统总线连接了起来。 但仅仅如此肯定是不够的。我们还会想增加更多的输入输出设备。 比如说打印机,比如说 硬盘,有了这些其实就很像早期计算机的构造。 计算机作为一个整体已经可以开始运行了。 当然我们还可以通过网络将计算机内部的信息 与其他设备或其他计算机进行交互, 我们还可以增加更多的输入输出设备,进行更为丰富的人机交互, 现在看到的这些就是在个人计算机中常见的输入输出设备了。 早期的个人计算机中几乎每一个设备都需要通过 对应的输入输出芯片或者板卡进行连接,例如我们会需要单独的网卡, 单独的声卡等等。
在现在的个人计算机当中, 大多数的输入输出设备的控制芯片都会集中在 主板上的南桥芯片中,例如我们刚才提到的 这些设备。 那么对于一些比较复杂的输入输出的需求, 比如高性能的显示,还是需要独立的板卡与外部的设备进行相连。 这就是以个人计算机为例所展示的输入输出设备相关的情况。
运算器,控制器, 存储器再加上输入和输出, 我们通过模型机的构建已经掌握了冯诺依曼结构的基本原理。 但是这个基本原理和真实的计算机之间是否能够一一对应呢? 我们下一节来探讨这个问题。