存储器 - 总线:计算机内部的高速公路

存储器 - 总线:计算机内部的高速公路

计算机组成原理目录:https://www.cnblogs.com/binarylei/p/12585607.html

本文主要梳理计算机里不同的组件之间的通信问题,也就是总线机制。总线的设计思路,核心是为了减少多个模块之间交互的复杂性和耦合度。实际上,事件总线是一个常见的设计模式,通常事件总线也会和订阅者发布者模式结合起来,成为大型系统的各个松耦合的模块之间交互的一种主要模式。

1. 降低复杂性:总线的设计思路来源

计算机里其实有很多不同的硬件设备,除了 CPU 和内存之外,我们还有大量的输入输出设备。可以说,计算机上的每一个接口,键盘、鼠标、显示器、硬盘,乃至通过 USB 接口连接的各种外部设备,都对应了一个设备或者模块。

如果各个设备相互单独通信,那么 N 个设备,系统复杂度就会变成 N2。每一个设备或者功能电路模块,都要和其他 N−1 个设备通信。为了简化系统的复杂度,我们就引入了总线,把这个 N2 的复杂度,变成一个 N 的复杂度。

图1:总线将复杂度由 N^2 降低为 N

说明: 总线就好像一个高速公路,设备要向 CPU 发送什么信息,不需要单独建公路,只建一条小路通向这条高速公路就好了。

这种设计思路,在软件开发中也是非常常见的。大型系统开发的过程中,经常会用到一种叫作事件总线(Event Bus) 的设计模式。在事件总线这个设计模式里,各个模块触发对应的事件,并把事件对象发送到总线上。也就是说,每个模块都是一个发布者(Publisher)。而各个模块也会把自己注册到总线上,去监听总线上的事件,并根据事件的对象类型或者是对象内容,来决定自己是否要进行特定的处理或者响应。

图2:事件总结的发布订阅模式

2. 理解总线:多总线架构和三种线路

2.1 多总线架构

现代的 Intel CPU 的体系结构里面,通常有好几条总线。CPU 和内存以及高速缓存通信的总线,我们称之为双独立总线(Dual Independent Bus,缩写为 DIB)。这个双独立总线通常分为两部分:一个速度相对较快的本地总线(Local Bus)和一个速度相对较慢的前端总线(Front-side Bus)。

  • 本地总线:用来和高速缓存通信的。也叫作后端总线(Back-side Bus)。
  • 前端总线:用来和主内存以及输入输出设备通信的。也叫作处理器总线(Processor Bus)、内存总线(Memory Bus)。
图3:前端总线被北桥芯片一分为三:系统总线、内存总线、I/O总线

说明: 在上图中我们看到,北桥芯片把前端总线一分为三,变成系统总线、内存总线、I/O 总线。我们的前端总线,其实就是系统总线。CPU 里面的内存接口,直接和系统总线通信,然后系统总线再接入一个 I/O 桥接器(I/O Bridge)。这个 I/O 桥接器,一边接入了我们的内存总线,使得我们的 CPU 和内存通信;另一边接入一个 I/O 总线,用来连接 I/O 设备。

因为不同设备之间的速度有差异,所以一台计算机里面往往会有多个总线。除了前面的三类总线外,根据不同的设备,还会分成独立的 PCI 总线、ISA 总线等等。

图4:各种总线关系图

2.2 三类线路

在物理层面,其实我们完全可以把总线看作一组“电线”。不过这些电线之间也是有分工的,我们通常有三类线路。

  1. 数据线(Data Bus):用来传输实际的数据信息,也就是实际上了公交车的“人”。
  2. 地址线(Address Bus):用来确定到底把数据传输到哪里去,是内存的某个位置,还是某一个 I/O 设备。这个其实就相当于拿了个纸条,写下了上面的人要下车的站点。
  3. 控制线(Control Bus):用来控制对于总线的访问。虽然我们把总线比喻成了一辆公交车。那么有人想要做公交车的时候,需要告诉公交车司机,这个就是我们的控制信号。

2.3 总线裁决

我们的总线是很多个设备公用的,那多个设备都想要用总线,我们就需要有一个机制,去决定这种情况下,到底把总线给哪一个设备用。这个机制,就叫作总线裁决(Bus Arbitraction)

3. CPU 和 I/O 设备通信

在计算机系统里面,CPU 和 I/O 设备之间的通信,是这么来解决的。

首先,在 I/O 设备这一侧,我们把 I/O 设备拆分成,能和 CPU 通信的接口电路,以及实际的 I/O 设备本身。接口电路里面有对应的状态寄存器、命令寄存器、数据寄存器、数据缓冲区和设备内存等等。接口电路通过总线和 CPU 通信,接收来自 CPU 的指令和数据。而接口电路中的控制电路,再解码接收到的指令,实际去操作对应的硬件设备。

而在 CPU 这一侧,对 CPU 来说,它看到的并不是一个个特定的设备,而是一个个内存地址或者端口地址。CPU 只是向这些地址传输数据或者读取数据。所需要的指令和操作内存地址的指令其实没有什么本质差别。通过软件层面对于传输的命令数据的定义,而不是提供特殊的新的指令,来实际操作对应的 I/O 硬件。

图5:CPU 和 I/O 设备通信

参考:


每天用心记录一点点。内容也许不重要,但习惯很重要!

posted on 2020-03-30 20:24  binarylei  阅读(1070)  评论(0编辑  收藏  举报

导航