总线控制与仲裁
总线控制与仲裁
复习定位
总线是共享资源——多个设备都可能请求使用总线。仲裁决定"谁先用"。不同仲裁方式的区别在于响应时间(等多久)和公平性(够不够饿着)。理解仲裁机制后就能明白为什么PCIe的点对点链路从根本上消除了共享总线的仲裁需求。
为什么需要仲裁
总线主设备(Bus Master)是能够主动发起总线事务的设备(通常是CPU或DMA控制器)。从设备(如内存)只能应答主设备的请求——不能主动发送数据。当多个主设备同时请求使用总线时——总线仲裁器决定哪个设备获得总线控制权。
决策维度:优先级(高优先级设备先用)和公平(低优先级设备不永远饿死)。在DSP实时系统中优先级保证比公平重要——硬盘DMA传输数据必须优先被响应以保证实时音频不欠载运行。在高并发系统中公平更重要——处理32个CPU核心之间的缓存一致性队列需要每个核对总线使用权有一定的切片比例。
集中式仲裁的三种方式
链式查询:所有设备通过一根公共的"总线请求(BR)"线向仲裁器请求。仲裁器通过"总线授权(BG)"线逐级连接各设备——从离仲裁器最近的设备开始查——第一个请求的设备获得授权。优点是硬件最简单(只用一根授权线串联)——但缺点明确:优先级固定且离仲裁器最近的设备具有最高优先级——如果最近的设备持续请求——远处的设备永远无法获得总线。链中任何一点的连接断路(如设备被拔出)会导致后面的设备全部失联。
计数器定时查询:仲裁器有一个计数器——收到请求后从当前计数值开始递增轮询各设备——被问到且请求了的设备获得授权。计数器可从0开始(优先级固定)或从上一次结束的位置继续(循环优先级——各设备机会均等)。计数器值可通过软件设定——优先级可调是高灵活性。代价是需要log₂(n)根设备地址线进行轮询——n=16时需要4根计数输出线。
独立请求方式:每个设备有独立的REQ#(请求)和GNT#(授权)线——仲裁器知道所有设备在请求且能立即响应。仲裁器内部有一个优先级编码器——并行比较各请求的优先级(可通过程序设置)。响应最快——但需要2n根信号线、仲裁器内部的电路为所有可能的请求组合设置优先级逻辑——n大时成本激增。
分布式仲裁
没有中央仲裁器——每个主设备有自己的仲裁编号。所有设备把自己的编号驱动到共享的"仲裁总线"上。各设备同时读取共享仲裁总线——比较总线上的号码和自己的号码——如果自己的号码大于总线上当前的值则撤销自己的请求(更高优先级的设备胜出)。总线稳定后——总线上的号码就是获胜设备的编号。
分布式仲裁的优点:没有单点故障(无中央仲裁器)、扩展性好(多一个设备只需多一组驱动和比较电路)。缺点是在总线上所有设备必须同时驱动和比较——仲裁总线信号必须在不到一个时钟周期内稳定、频受总线电容负载的限制——设备数不能太多。
PCI总线的仲裁机制
PCI总线(并行共享总线架构)使用集中式独立请求仲裁。每个PCI槽分配一对REQ#(请求)和GNT#(授权)线——连接到芯片组的PCI仲裁器。仲裁器内部采用轮转(round-robin)加上隐藏的优先级编程——保证所有设备在一轮循环中都获得一次访问权(一次释放后选中下一个请求者)。PCI仲裁器在后台以隐藏的方式工作——当前总线事务进行时就开始仲裁下一轮的获胜者——减少总线空闲时间(称为"隐含仲裁")。
总线时间分配的计算
设三个主设备A/B/C。A每次事务需4个总线周期、B需2个、C需2个。总线空闲周期为1个周期。
轮转仲裁顺序A→B→C→A→...:每个设备的"等待时间"等于前一轮的其他设备的总线占用时间之和。如果所有设备按相同长度的事务进行轮转,各设备大致公平。如果A的传输长度是B和C的两倍在一轮中——A占用4单位——B和C各用2单位——加上空闲1周期——一轮共9周期——B从发出请求到获得响应需要等待4(A)+2(C)+1(空闲)+2(B已完成但等待仲裁时间必须等它下一轮)因此延迟会有波动。
集中式独立请求仲裁的总线利用率计算:总线上有效传输时间除以总时间(含仲裁和开销)。如果设备大部分事务都是短事务(如Cache line的读出和写入)、仲裁时间开销占比不可忽视——需要用更高效的突发传输(单次仲裁后续读多个地址)来提高实际带宽利用率。
PCIe如何消除了总线仲裁
PCIe不再是共享总线——而是点到点串行链路。每一个设备通过独立的Lane直接连接到PCIe交换器(Switch)。交换器根据TLP(事务层包)中的目标地址在内部查找路由表——把数据包定向到目标的端口——多个设备之间通过交换器并行转发的电路交换机制连接——互相不争用链路带宽。
因此PCIe的总线上根本不存在"谁先发"的仲裁——每对设备之间的Lane是全双工专用通道——不需要检查总线是否被其他设备占用。唯一可能产生争用的是Switch的内部缓冲——但这由交换器的内部调度算法处理——对软件和操作系统完全透明。这一架构突破了传统的瓶颈——所以PCIe的带宽随版本迭代以指数增长远超PCI的线性增长极限。
复习检查
链式查询中如果离仲裁器最近的设备长期请求使用总线——最远的设备会怎样——什么条件下它会获得总线?
在独立请求方式下增加一个主设备需要增加几根信号线——为什么?
PCI的总线仲裁中"隐含仲裁"是什么意思——为什么它减少了总线空闲时间?
为什么PCIe共享总线不需要仲裁机制——交换器内部如何解决多个端口同时向同一目标端口发送的争用?
分布式仲裁中仲裁总线上所有设备同时驱动自己的编号——如果两个设备的编号相同会怎样?仲裁器如何设计避免这一冲突?