前言
大家好,我是jiantaoyab,前面讲了CPU和内存,那么CPU 从我们的键盘、鼠标接收输入信号,向显示器输出信号,这之间究竟是怎么通信的呢?换句话说,计算机是用什么样的方式来完成,CPU 和内存、以及外部输入输出设备的通信呢?本篇文章大家讲讲总线
总线设计
计算机里其实有很多不同的硬件设备,除了 CPU 和内存之外,我们还有大量的输入输出设备。可以说,计算机上的每一个接口,键盘、鼠标、显示器、硬盘,乃至通过 USB 接口连接的各种外部设备,都对应了一个设备或者模块。
如果各个设备间的通信,都是互相之间单独进行的。如果我们有 N个不同的设备,他们之间需要各自单独连接,那么系统复杂度就会变成 N^2。每一个设备或者功能电路模块,都要和其他 N−1个设备去通信。
为了简化系统的复杂度,我们就引入了总线,把这个 N2^2 的复杂度,变成一个 N 的复杂度。
总线,其实就是一组线路。 CPU、内存以及输入和输出设备,都是通过这组线路,进行相互间通信的。总线的英文叫作 Bus,就是一辆公交车。这个名字很好地描述了总线的含义。公交车的各个站点,就是各个接入设备。要想向一个设备传输数据,我们只要把数据放上公交车,在对应的车站下车就可以了。
在大型系统开发的过程中,经常会用到一种叫作事件总线的设计模式。
在事件总线这个设计模式里,各个模块触发对应的事件,并把事件对象发送到总线上。也就是说,每个模块都是一个发布者。而各个模块也会把自己注册到总线上,去监听总线上的事件,并根据事件的对象类型或者是对象内容,来决定自己是否要进行特定的处理或者响应。
现代的 Intel CPU 的体系结构里面,通常有好几条总线。
CPU 和内存以及和高速缓存通信的总线通常是由两种总线组成,我们称之为双独立总线DIB。CPU中有一个快速的本地总线(Local Bus)和一个速度相对较慢的前端总线(Front-side Bus)。
高速本地总线,是用来和高速缓存通信的。前端总线,是用来和主内存以及输入输出设备通信的。
有时候,我们会把本地总线也叫作后端总线(Back-side Bus),和前面的前端总线对应起来。而前端总线也有很多其他名字,比如处理器总线(Processor Bus)、内存总线(Memory Bus)。
前端总线,其实就是系统总线。CPU 中的内存接口直接和系统总线通信,然后系统总线再接入一个 I/O 桥接器。
这个 I/O 桥接器,一边接入内存总线,使CPU和内存通信;另一边接入了一个 I/O 总线,用来连接 I/O 设备。
事实上总线层面拆分得更细。根据不同的设备,还会分成独立的 PCI 总线、ISA 总线等等。
在物理层面通常有三类线路。
- 数据线(Data Bus),用来传输实际的数据信息
- 地址线(Address Bus),用来确定到底把数据传输到哪里去,是内存的某个位置,还是某一个 I/O 设备。
- 控制线(Control Bus),用来控制对于总线的访问。
尽管总线减少了设备之间的耦合,也降低了系统设计的复杂度,但是总线不能同时给多个设备提供通信功能。那多个设备都想要用总线,我们就需要有一个机制,去决定这种情况下,到底把总线给哪一个设备用。这个机制,就叫作总线裁决(Bus Arbitraction)。