漫谈计算机组成原理(二)之系统总线
在这个系列文章的第一讲,漫谈计算机组成原理(一)之程序运行的过程 中说过,现代计算机是从冯若伊曼计算机发展起来的。其组成部分有存储器、运算器、控制器、输入设备、输出设备,在现代计算机中,人们将运算器与控制器封装起来成为CPU(中央处理单元)。计算机的各种部件想要进行数据交互,就必须让这些部件形成一定的连接关系,以便数据交互的进行。
连接的方式有两种,一种是各个部件之间使用不同的线相互连接,很明显,这种交互方式有很大的弊端,如连线复杂造成的控制复杂,还有就是当部件较多的情况下,简直就是个灾难。所以就催生了另外一种连接方式——总线连接,也就是我们这一讲要讲述的东西。
总线连接是指,将所有就的部件连接在一组公共的信息传输线上,这样做就避免了上面那种传输方式的弊端。现代计算机几乎所有的都是采用总线连接。
概述
从引言中,我们基本上能够了解到总线在计算机系统中的作用。但是上面的说法只是一个概论,我们需要给出更加详细的总线的作用:总线是计算机中各个部件的信息传输线。在计算机中,几乎所有需要信息传输的地方,都是存在总线的。
那么,总线传输的信息具体来讲是什么呢?总的来讲,总线传输的信息可以使数据、地址(详情请看第一讲https://blog.csdn.net/yanmiao0715/article/details/80338802)等,接下来会详细介绍。
另外,从传输方式上来讲,共有两种传输方式。一种是并行的,另外一种串行的方式,两种方式各有利弊。
总线的传输方式
并行方式
并行传输方式很简单,就是在同一时间内,传输多位数据,而计算机的位数,就是按照系统总线传输的数据位数划分的,常见的有32位、64位等。
注意,并行方式并不合适远距离数据传输,因为并行传输方式,一旦距离过长,那么各条总线的相互干扰则十分强大,数据丢失、错误也就成了必然。
所以,并行传输用在计算机内部,就非常可靠了。既保证了传输速度,又保证了数据传输的可靠性。串行方式
串行方式很明显不适用于计算机内部的数据传输,一来一条总线传输速度实在是慢,另外会导致计算机的总线分布过于复杂。
不过,与上面的方式正好相反的是,这种方式可以避免远距离传输的数据干扰。
总线的结构框图
在了解了基本的总线传输方式后,我们将从比单根总线更大的方面来介绍总线的具体结构。
所谓的总线结构,就是总线在计算机中的具体分布位置,这个位置的不同,会导致计算机的各个方面的不同,下面就来一一介绍。
面向CPU的双总线结构
在这种结构中,包括了M总线(CPU与主存之间的数据传输总线)、I/O总线。优点是多条总总线,并行传输,效率高。缺点也很明显,其一是事件执行过程容易被打断,比如当前IO设备正在占用总线,与CPU或者主存之间在传输数据,而另外一个设备此时却发起了占用请求,IO总线还要停下来处理占用请求;其二是IO设备无法直接与主存进行信息交互,只能通过CPU这个介质,但是这就无端端的占用了CPU,CPU完全可以在被占用的这段时间处理数据,所以,就需要改进。单总线结构
这种结构中,只有一条总线:系统总线。计算机中的所有设备都连接在这条总线上。这种方式的优点基本可以忽略了,缺点太多:
当CPU进行数据处理的时候,非常容易被打断,类似于上面的情况,就导致了CPU的效率过低;如果计算机中有很多的设备,很难想象这条总线要长到什么程度,总线越长,延迟越高;最后,这么多的设备,只有一条系统总线,典型的狼多肉少,这些设备之间一定会打架的。以存储器为中心的双总线结构
最后的这种以存储器为中心的双系统总线结构,也就是在第一讲之中提过的现代计算机的结构。这种结构整合了上面两种方式的结构,做到了扬长避短。虽然和单总线结构挺像,但是,它在CPU和主存之间加入了一条存储总线,这样保证了CPU和主存交互是不占用系统总线,也就避免了CPU的执行被打断,CPU需要的数据既可以从主存中获取,又可以从总线中获取,非常强大;另外,系统总线和存储总线飞凯,提高了效率的同时,还减轻了系统总线的负担。
总线分类
片内总线
所谓的片内总线,就是CPU内部的总线,连接着CPU内部的各个部件。
系统总线
- 数据总线:数据总线是双向传输的,和机器字长、存储字长有关系
- 地址总线:地址总线是单向的,包括存储地址、IO地址
- 控制总线:有入、有出,发出各种控制信号
当然,总线分类的内容还有很多,包括一些常见的术语,这里就不再赘述了,在后面的讲解中遇到什么就会解释什么。
总线性能指标
- 总线宽度:数据总线的根数
- 总线带宽:总线的数据传输速率,也就是每秒传输的最大字节数,单位MBp/S
- 总线复用:一条信号线上分时传送两种信号
- 信号线数:地址总线、数据总线 、控制总线的数目总和
- 总线控制方式
总线结构
单总线结构
单总线结构在总线结构框图中其实已经说过了。就是上面那种问题特别多的总线结构。这里就不再赘述。
多总线结构
双总线结构
可以看到,这种方式,是将I/O接口接在了与主存总线通信的通道上,那么这个通道是什么呢?这个通道实际上是由计算机操作系统控制的一个特殊的处理器,用来对I/O设备进行管理。
图中所示只有一个通道,实际上是有很多通道的。人为的将不同速度的I/O设备换分为不同的组,进而将这些组分别接在不同的通道上,可以预见,这种结构的总线数据吞吐量是十分高的,就实现了一个相当强大的计算机系统。
而这种结构,通常被用在大型计算机上。
三总线结构
- 第一种
这种结构的总线包括:主存总线、DMA总线(直接存储器访问,顾名思义,使用这条总线的I/O设备可以直接向主存的读写数据)、I/O总线。
其中,DMA总线连接的是告诉I/O设备,最好能够和主存(内存条)的速度在一定程度上匹配。
在这种结构中,任意时刻,只有一条总线被占用。主存总线肯定不能和DMA总线同时被占用,而I/O设备只在CPU调用I/O指令的时候才会被用到。
我觉得你有可能会有这么个疑问:I/O总线会不会和DMA总线同时被占用?肯定是不能的,因为前面说了,I/O总线只有在调用I/O指令的时候才会被占用,在占用的过程中,没有CPU的控制,高速I/O设备怎么可能会和主存交互。
- 第二种
这种结构,是将CPU和Cache(缓存设备)之间加入了局部总线,不仅如此,主存和Cache都连接在系统总线上,去掉了CPU和主存的信息传输,此时与CPU直接进行信息传输的是Cache,我们知道,Cache是一种比主存更快的设备,Cache可以直接通过总线读取主存中的信息,然后交给CPU,这样就速度就会飞起。另外,扩展总线的存在,使得设备扩展变得极为容易。
四总线结构
对比三总线结构,四总线就是将三总线更加细分,将I/O总线分成了高速总线和低速扩展总线。由于四总线结构并不是特别常见,这里就不详细说明了,感兴趣的小伙伴可以自己查阅一下相关的资料。
总线控制(重要内容)
接下来的这个内容,可以说是系统总线这一讲中最为核心的部分。
概述
总线的控制主要是两个方面的内容。
首先,我们可以想象到,当某一个时间点上,有了多个设备同时发出总线的占用请求,那么总线应该去响应哪一个设备的占用请求呢?再者,我们讲了,在信息传输的过程中,不可避免的会出现信息丢失,如何保证数据传输的完整性呢?这就是我们要讨论的第一个问题——总线的判优控制。
其次,虽然总线的判优控制解决了总线应该与哪一个设备交互的问题,但是还是存在这样一个问题的:两个设备,一个主设备(对总线有控制权的设备)和一个从设备(只能响应从总线发来的命令)进行交互的时候,主设备何时占用传输数据?从设备何时发送响应数据?这就是我们要讲的第二个问题,也就是总线的通信控制。它的作用就是解决通信双方的协调配合的问题。
总线的判优控制
具体的讲,总线的判优控制共有两种方式,一种是集中式,将所有的控制逻辑集中在一个部分;另外一种是分布式,也就是将控制逻辑集中在各个部分。而分布式并不常见,这里只介绍集中式的判优控制。
链式查询
首先来说明一下这张图片上各个英文名称的意义。BS:总线忙,也就是当前总线正在被使用;BR:总线请求:设备的总线请求信号就是从这条线上发出的;BG:总线同意,当总线同意设备的占用请求时,同意信号将会从这里发出。
链式查询方式,顾名思义,就是将所有设备像链子一样串联起来。
工作流程如下:某一个设备检测到当前总线空闲,则通过BR线向总线发出占用请求,当总线控制部件收到了占用请求后,他只知道收到了占用请求,却不知道是哪个设备发出的占用请求;此时就会通过总线同意BS线查询,直到查找到发送总线占用请求的设备即停止。
可以看到,这种判优控制中,设备的优先级是按照位置确定的,总是离总线最近的那个设备会有限被查找到。也就是说,最后一个设备可能永远无法占用到总线。这就非常坑了,如果无法占用总线,也就代表着无法正常工作,那还要这个设备做什么呢?
还有一点,前面说了,这些设备是串联起来的,通过一根BS线,那么,当BS线某处发生了损坏,则查询将无法进行。计数器定时查询
很明显,第一种链式查询方式在实际使用中肯定是各种问题,这种方式能够大大的改进种种情况。
相比较于链式查询方式,这种方式去掉了BG(总线同意)线,而增加了设备地址线,也就是定时查询计数所指示的那条线。
当总线接收到BR线的请求信号后,在总线未被占用的情况下,总线控制部件中的计时器开始计数,通过设备地址线向设备发送地址,当某设备地址与发送请求的设备地址一致时,设备则获得总线控制权,计数器停止计数。
如果在查找过程中,当前计数地址与发送请求的设备地址没匹配上,则计数器+1,直到找到这个设备为止。
这个计数器的值是可以通过软件来设定的,这样,就能够人为的确定设备的优先级。
【注】这种方式的设备地址线的条数为[log2n]条(n为设备数)。独立请求方式
这种方式就非常有意思思了,简单的讲,就是将总线请求(BR)和总线同意(BG)线给每个设备都分配一下,当然,每个设备都需要连接一下地址线和数据线。
总的过程和上面的方式没有太大区别,主要的区别在于,这里的优先权控制变成了排队器,给每个请求排队,然后再执行。当然,这种方式是很有好处的,最起码执行速度非常的快,但是,一旦设备过多,那又变成了灾难。
总线的通信控制
由于总线的通信控制主要解决的就是:通信双方的协调配合问题,那么在不同时间段,就会出现不同的状态。所以我们这里引入一个总线生命周期的概念。
总线的生命周期
总线生命周期,是指主从设备完成一次完整的信息通讯的过程。这个过程包括三个阶段:
申请分配阶段
就是主设备申请总线控制权的过程寻址阶段
也就是总线控制器寻找到底是哪个设备发起的控制请求的过程。数据传输阶段
- 结束阶段
而我们接下来要讨论的内容就是数据传输阶段的通信过程。
通信方式
- 同步通信:由统一时标控制通信的数据传输
这张图片表示的是某个设备向CPU传输数据的过程。
整个的传输过程如下:
- 在T1时间的上升沿(上升沿这个词其实不难理解,就是时钟向上走的部分,对应下降沿就是时钟线向下走的过程),主设备(CPU)给出读数据的目的地址
- 在T2上升沿,主设备(CPU)给出读命令
- 在T3上升沿,从设备给出数据信息,执行读数据操作
- T3下降沿,读命令、数据信号撤销
- T4,地址线撤销
这种方式,比较中规中矩,就是说在每一个时间段,执行固定的操作,模块间的配合较为简单。缺点也很明显,就是中规中矩的缺点,不够灵活,设备必须在规定的时间内执行完成相应的操作。
在这中方式中,主从模块的操作按照统一的时标操作。主从设备的速度如果相差较大,那么速度快的设备必须等待速度慢的设备执行。
【适用范围】适用于总线长度较短、各部件存取时间比较一致的场合。
- 异步通信
异步通信就比较灵活了,没有统一的时标,只需要主设备发出请求,从设备发出响应即可。异步通信分成了三种方式:
- 不互锁
想象这样的一个场景,一个人向另外一个人打招呼,打完招呼就去忙自己的事情了,不管那个人是否听到了自己的问候,都去做自己的事情。类比这种情况:主设备发出请求,发完请求后就去执行其他的操作了,不管从设备是否收到了回答。理想的状况下肯定是需要从设备回答的,这就衍生了另外一种方式。 - 半互锁
再想象一个场景,A向B打招呼,如果B和A没有仇的话,B肯定是会回复A的,如果A发现B没有搭理他,那么他一般会再和B打招呼,如果B依然不回应,那么这个过程就会持续下去。
到这里也是一样的,当主设备向从设备发出信号时,如果从设备接收到这个信号,那么就会向主设备发送响应信息。如果主设备一直没有接收到这个信号,就会一直向从设备发送信息。 - 全互锁
全互锁,就是半互锁的升级版本。在半互锁中,如果主设备没有收到从设备发出的响应信号,除了是从设备没有接收到主设备的信号外,还有可能是因为从设备发送的信号主设备没有收到,如果是这种情况,主设备也会一直请求下去。
在全互锁的情况中,如果主设备发出信号后,从设备也收到了信号,则会向主设备发送响应信号;如果主设备接收到了信号,那么就会再从设备发送一个表示接收到了的信号,此时从设备就可以撤销响应信号了。如果没有收到,则从设备就会保持这个响应信号。
总结一句话就是,主设备一直请求,从设备一直应答。
- 不互锁
- 半同步通信(同步、异步结合)
为什么说半同步通信是同步通信和异步通信相互结合的方式呢?因为半同步通信保留了同步通信的时钟周期,又继承了异步通信的能够使得不同速度的设备协调工作的优点,可以说是十分的强大。
从图中可以看到,半同步通信不同于同步通信的一个重要的特点就是:增加了两个Tw周期,还增加了WAIT信号。下面我们就来说一下它的具体情况。
首先,和同步通信相同,都是在T1给出地址信号,T2给出读命令,读命令给出后,紧接着的并不一定是数据信号。如果从设备的速度很慢,不能在T3时间给出数据,则会通知主设备,我现在还没有准备好。随后主设备就会给出WAIT信号,插入等待周期,当从设备说我已经准备好了的时候,主设备就会撤销掉等待信号,开始读数据。后面的情况就和同步通信一致了。 - 分离式通信:充分发挥系统总线每瞬间的潜力
这种通信方式比较复杂,我们很难在一般的计算机上见到,这里就不多说了,只需要知道它的这个特性就可以了。感兴趣的可以看看这片博文:https://blog.csdn.net/ce123_zhouwei/article/details/6936047,不过我发现这个作者好像是直接摘抄的唐朔飞教授的《计算机组成原理》这本书。无奈╮(╯▽╰)╭,大家看看就行了。
结语
感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!
微信公众号:进击的程序狗
邮箱:roobtyan@outlook.com
个人博客:http://roobtyan.cn