仲裁器是分配对共享资源的访问的电子设备。
执行计算机总线仲裁有多种方法,最常用的方法有:
总线仲裁器是在多总线系统中使用的一种设备,它决定在每个总线周期中允许哪个总线主控制总线。 在系统总线系统中,最常见的总线仲裁器是存储仲裁器。
内存仲裁器是共享内存系统中的一种设备,用于决定每个内存周期允许哪个 CPU 访问该共享内存。[1][2][3]
一些原子指令依赖仲裁器来阻止其他 CPU“中途”读取内存的原子读-修改-写指令。
内存仲裁器通常集成到内存控制器/DMA 控制器中。
一些系统,比如 PCI,有一个集中的总线仲裁设备,人们可以把它指向“总线仲裁者”。 其他系统使用分散的总线仲裁,其中所有设备协作决定谁下一个。[4][5]
当连接到内存仲裁器的每个 CPU 具有同步的内存访问周期时,可以将内存仲裁器设计为同步仲裁器。 否则,内存仲裁器必须设计为异步仲裁器。
异步电路中仲裁器的一种重要形式是在异步请求之间选择对共享资源的访问顺序。 它的功能是防止两个操作同时发生在不应该发生的时候。 例如,在一台有多个 CPU 或其他设备访问计算机内存,并且有多个时钟的计算机中,可能存在来自两个不同步源的请求几乎同时进入的可能性。 “接近”可以在时间上非常接近,在亚飞秒的范围内。 然后,内存仲裁程序必须决定先服务哪个请求。 不幸的是,不可能在一个固定的时间做到这一点。[需要解释]
仲裁人断绝关系。 就像触发器电路一样,仲裁器有两个对应于这两个选择的稳定状态。 如果两个请求在几皮秒内(今天是飞秒)到达一个仲裁器,电路可能在达到其稳定状态之前变成亚稳态以打破平衡。 经典的仲裁者经过特殊设计,在亚稳态时不会剧烈振荡,并尽可能快地从亚稳态衰减,通常是通过使用额外的功率。 在提供输入之后,未达到稳定状态的概率随时间呈指数下降。
上世纪70年代中期,人们找到了解决这一问题的可靠办法。 尽管在固定时间内做出决定的仲裁者是不可能的,但是有时候在困难的情况下需要更长的时间(千钧一发)的仲裁者还是可以工作的。 必须使用多级同步电路来检测仲裁器是否还没有进入稳定状态。 然后仲裁者延迟处理,直到达到稳定状态。 理论上,仲裁者可以用任意长的时间来解决问题(见布里丹原理) ,但实际上,它很少需要几个门延迟时间。 经典的文章描述了如何建立一个“3状态触发器”来解决这个问题,并提醒工程师在仲裁设计中的常见错误。
这个结果具有相当重要的实际意义,因为没有它,多处理器计算机就不能可靠地工作。 第一台多处理器计算机可以追溯到20世纪60年代末,比可靠仲裁者的发展还要早。 一些早期的多处理器与独立的时钟为每个处理器遭受仲裁竞争条件,因此不可靠。 如今,这已不再是一个问题。
仲裁器也用于同步上下文,以便分配对共享资源的访问。 波前仲裁器是同步仲裁器的一个例子,存在于一种大型网络交换机中。