一、引子
在之前的学习中,我们已经知道了总线的基本原理以及评价总线性能的一些指标。
:question: 那么总线仲裁
是要解决什么问题呢?
由于总线是一种共享的资源,同一时刻只能提供给一组设备进行数据的传输。
各种设备对总线的使用必须是互斥进行的。
因此当多个设备都想使用总线的时候,就必须提供某一种机制来仲裁
。来裁决让哪一个设备使用总线。
所以,总线仲裁是解决多个设备争用总线的问题。
二、总线仲裁
在之前的学习中,我们了解到单总线结构,如下:
无论是CPU、主存还是I/O设备,都通过一条系统总线进行连接。
当然,这一组系统总线包括数据总线、控制总线和地址总线。
==同一时刻只能有一个设备控制总线传输操作,可以有一个或多个设备从总线接收数据。==
当一个设备1想通过总线来传送数据的时候,那么它就会先通过控制总线对总线控制器发送请求,请求总线的使用权;当总线的使用权分配给这个设备1的时候,这个设备1就可以通过数据总线和地址总线来传递数据。它要和什么设备进行数据传输,是由已经获得总线控制权的设备来决定的。
上面说了,设备1对总线的控制权发送了请求,当它获得了总线的控制权之后,它就变成了主设备
。这个主设备接下来可以通过地址总线来选择它接下来要和哪一个设备进行数据交互。这个被迫进行数据交互的设备就叫做从设备
。从设备只能被动响应主设备发来的信号。
谁控制了总线,谁就是主设备。就可以强迫其他设备与自己进行数据的读写。
:question:为什么要仲裁?
当多个设备都想争抢总线的使用权,就必须通过总线仲裁的方式来决定到底让哪一个设备优先获得总线的控制权。
总线作为一种共享设备,不可避免地会出现同一时刻有多个主设备竞争总线控制权地问题。
所以总线仲裁本身也是一种调度问题
,就是排一个优先级,看看谁先使用。
只不过总线仲裁是通过纯硬件来实现的。
总线仲裁的定义:
多个主设备同时竞争主线控制权时,以某种方式选择一个主设备优先获得总线控制权称为总线仲裁。
总线仲裁可以分为两种方式:
1.集中仲裁方式
链式查询方式、计数器定时查询方式、独立请求方式
2.分布仲裁方式
三、集中仲裁方式
总线控制器一般会被集成在CPU内部或桥接器里面。
它负责协调这一条总线上连接的所有设备如何协调工作。
上一小节提到的总线时钟信号
也是由总线控制器发出的。
1.链式查询方式
(1)介绍
- 数据线和地址线里面可能包含多根信号线,可以同时传输多个比特的数据。虽然图中只画了一根,这是为了方便图示,准确来说,是
一组
。 - BG用来传递
总线允许
的信号。 - BR用来传送
总线请求
的信号。
当某一个设备想要使用总线的时候,就往BR上发送一个请求信号(比如高电平信号)。
然后总线控制部件检测到BR传过来的有效信号之后,就知道此时有某一个设备或者某些设备想要使用总线。
- BS表示
总线忙
。
BG、BR、BS是3根信号线,每根线只能传送一个电信号。它们都属于 控制总线。控制总线其实包含很多条线,这三根线就属于控制总线的某三根。
只不过链式查询方式只需要这三根线就可以完成了。
(2)过程
接下来探讨一下链式查询方式是如何完成的。
<1> 假设设备1和设备n想要同时使用总线,同时想要获得总线的控制权。
那么,这两个设备的设备接口都会向BR
(总线请求)发送一个请求信号(比如高电平)。(图中蓝线)
<2>总线控制部件
检测到BR发来的高电平信号,就知道此时有一个设备或者几个设备想要使用总线。
那么要将总线的使用权分配给哪个设备呢?
总线控制部件通过BG
(总线允许)发送一个信号(比如高电平信号),这个信号首先通过BG来到设备0。但是设备0此时并不想使用总线,所以设备0让电信号继续往后传递。
接下来到了设备1,由于设备1此时想要使用总线,所以当它接收到总线允许的信号之后,就意味着总线控制部件就允许它对总线进行控制了。(图中黄线)
<3> 所以设备1获得了总线的控制权,同时往BS
(设备忙)发送一个信号(比如高电平信号),来表示这条总线的使用权已经被我占领了。(图中红线)
<4>当总线控制部件检测到BS信号的时候,它就知道此时总线控制权已经被分配给某个设备了。
于是,总线控制部件会撤销BG(总线允许)信号。(图中黄线消失)
<5> 接下来设备1就可以使用数据线和地址线与其他设备进行数据交互了。
此时设备1获得了总线的控制权,那么设备n呢?
来看一下设备n咋办。
<1> 它一直在请求总线控制部件,想使用总线。
但是总线控制部件检测到了BS上有总线忙的信号,它就不会将总线控制权分配给下一个设备。
直到设备1使用完总线,它就会撤销总线忙的信号。
<2> 然后总线控制部件检测到BR上依然有设备想要使用总线。(图中蓝线)
所以控制部件同样会通过BG来发送总线允许的电信号,如果接收到这个电信号并且当前设备不想要使用总线,它就会让电信号继续往后传,直到传递到n设备。(图中黄线)
设备n想要使用总线,它此时会截断总线允许信号,不让总线允许信号继续向后传。
<3> 然后设备n向BS发送一个总线忙信号,通知总线控制部件总线使用权已经被我占领了。(图中红线)
<4> 总线控制部件再次撤销BG信号。
总线忙信号的建立者是获得总线控制权的设备。
(3)特点
由于BG是将各个设备按照固定的顺序串联起来,如果某一个设备此时想要使用总线,它就不会让BG信号继续往后传。
因此,对于这种链式查询方式来说,越靠近总线控制器的部件,优先级越高,就能够越快得到总线的使用权。
就比如刚才的设备1和设备n,都想要使用总线控制权。BG信号会被设备1半路截胡,不让BG信号继续传递。所以设备1的优先级比设备n高。
(4)优缺点
①优点
<1> 链式查询方式优先级固定
。(按照设备工作的重要性来排)
<2> 只需要很少几根控制线(BS、BR、BG三根)就能按一定优先次序实现总线控制,结构简单,扩充容易(只需要把想要加入的设备往后连,分别接上三根线即可)。
②缺点
<1> 对硬件电路的故障敏感,并且优先级不能改变。
假设设备1坏了,当BG信号传送给设备1之后,设备1不能让BG信号继续向后传递。
由于设备1的损坏,会导致后面的设备都不能接收到BG信号,就永远不能获得总线的控制权了。
<2> 当优先级高的设备频繁请求使用总线时,会使优先级较低的部件长期不能使用总线。(操作系统里面的饥饿问题)
2.计数器查询方式
(1)介绍
上图所示,可以发现,除了数据线和地址线,还有BS、BR,还增加了一组线设备地址线。
设备地址线:要表示地址,肯定需要多个bit才能表示。比如设备的编号是从0~n
,那么表示设备地址的这几根线比特位的数量必须能够表示0~n
的范围,只有这样才能表示每个设备的编号。
控制部件里面还增加了一个计数器,即有计数功能的硬件部件。
(2)过程
假设此时设备1和设备n都想要拥有总线控制权。
<1> 那么它们会同时向总线请求线BR
发出总线请求申请。(图中蓝线)
<2> 当总线控制部件检测到BR上的电信号时,就知道此时有某个设备或者某些设备想要使用总线。
但是具体是哪一个设备想要使用总线,这时候时不知道的。
那究竟要将总线使用权分配给哪个设备呢?
①当总线控制部件检测到有总线请求的时候,它里面的计数器会开始计数。
比如从0开始计数。如下:
当计数器的值为0的时候,就意味着设备地址线上传过来的信息数据就是0(多个二进制位表示的0)。
地址信息为0的意思就是说,它正在询问0号设备,是不是你想要使用啊?
②由于0号设备此时不想使用,所以计数器会自动加一。如下:
然后设备1发现,地址信号是自己的编号。
就意味着此时控制部件正在询问设备1,你想要使用总线吗?
③此时设备1是想要使用总线的。
所以当设备地址线检测到设备地址为1的时候,设备1就会往总线忙BS上发送一个有效信号。(图中红线)如下:
当控制部件检测到BS上传来了一个有效信号,这就意味着总线仲裁已经结束了。
已经选出了一个设备,让它获得了总线的控制权。
于是控制部件的计数器就不会再往后计数了(暂停计数)。
此时设备1就可以使用数据线和地址线来与其他设备进行数据交换了。
<3> 当设备1使用完总线之后,它就会撤回BS信号。
此时总线控制部件检测到总线已经不忙碌了(BS上没有有效信号了),而BR上还有请求信号。
那么总线控制部件又可以通过计数器来询问下一个设备要不要使用总线。
以此类推。
(3)特点
结构特点:用一个计数器控制总线使用权,相对链式查询方式多了一组设备地址线,少了一根总线响应线BG。它仍共用一根总线请求线。
计数器的计数方法有很多种。
①比如每次都可以从0开始,设备优先级就按顺序排列,固定不变。(和链式查询方式完全一样了)
②计数从上一次的终点开始,此时设备使用总线的优先级相等。
比如上一个例子中,设备1使用了总线,计数器是1号。那么还有设备想要使用总线的话,计数器就应该计数到2,然后一直到n,再回到0。
用这种循环计数的方式,可以保证各个设备对总线的控制权的优先级都是一样的。保证了公平性。
③计数器的初始值还可以由程序设置
如果想要计数器的计数方式更加灵活,我们还可以用程序设置的方式来设计更加复杂的计数。
(4)优缺点
①优点
<1> 计数器初始值可以改变优先次序,比较灵活。
计数器的集中仲裁方式可以保证各个设备对总线的使用权都是公平的。
<2> 对电路的故障没有链式敏感。
②缺点
<1> 增加了控制线数
<2> 控制相对比链式查询复杂
由于增加了计数器这种部件,而且每一个I/O接口必须能够识别计数器发过来的设备地址。
所以这种方式比链式查询方式的电路实现更加复杂。
3.独立请求方式
(1)介绍
可以看到,每个设备都和控制部件之间会有BR
请求线和BG
总线允许线相连接。
(2)过程
如果此时设备1和设备n都想使用总线。
<1> 那么它们会通过各自的BR总线请求线,向总线控制部件表达自己的请求。(图中蓝线)
<2> 在控制部件内部,会有一个专门的排队器(具体什么原理不用深究)。
当控制部件接收到多个设备的请求时,排队器会决定此时应该优先把总线的控制权分配给哪一个设备。
比如,此时排队器决定将总线的控制权分配给设备n。那么它就会给设备n所对应的BG返回一个允许的信号。(图中黄线)
<3> 其实,课本里面画的这个图,还少了一根线BS(总线忙)。看下面的图中红线:
所有的设备都会和总线忙这根信号线进行连接。
设备n接收到总线允许的信号之后,它会往BS总线忙这根信号线上发送一个信号。
当总线控制部件接收到BS信号之后,就意味着此次总线仲裁结束。已经将总线控制权分配给设备n了。
<4> 于是总线控制部件撤销BG信号。
当设备n使用完总线之后,设备n也会撤回BS的电信号。
当总线控制部件检测到BS上没有有效信号之后,它就可以继续检查此时还有没有设备发出BR总线请求信号。
接下来再经过排队器的处理,将总线的控制权分配给下一个设备。
(3)特点
结构特点:每一个设备均有一对总线请求线BR和总线允许线BG。
(4)优缺点
①优点
<1> 响应速度快。
总线允许信号BG直接从控制器发送到有关设备,不必在设备间传递或者查询。
<2> 对优先次序的控制相当灵活。
②缺点
<1> 控制线数量多
<2> 总线的控制逻辑更加复杂
4.总结
将上面三种方式总结对比如下:(注意各种方式的优缺点,选择题可能会考察)
四、分布仲裁方式
比如现在有一个游戏机,很多小孩想要玩这个游戏机。
分布仲裁方式并不会有一个大哥给大家当家作主,不会管游戏机应该分给谁。
比如现在5个小朋友里面1号、2号、3号小朋友想要玩游戏机,他们就会亮出自己的仲裁号(表明了优先级),由于1号小朋友个子特别高,别的小朋友都抢不过他,所以1号小朋友优先级最高,就会获得游戏机的使用权。
五、回顾
PS:这一节408不考,可以作为了解。
OK,有缘再会啦~