没有人喜欢排队,但是如果你要做任何严肃的并行处理,你会碰到许多队列作为线程或进程发送消息的方式。通常他们在软件中实现,这增加的开销计划,特别是当把东西或将其从队列中。
例如,当将一个新项放入队列,您必须检查是否有房间在队列中,你必须升级之后,主管,也说了,该做的也做了,你咀嚼10指令。此外,该队列信息可能是也可能不是在缓存中,你必须确保独占访问关键的地方,它可以得到你想要的足够缓慢,限制多少事情并行工作和他们交流。如果程序分手太细,然后失去太多时间not-so-instant进程或线程之间的消息传递
为了缓解这个问题,提出了硬件队列。但这些中断微架构,需要定制的互连。更糟的是,他们不是由操作系统,特别是当它涉及上下文切换。和建筑师的工作不值得羡慕决定让他们有多大,有多少提供:你知道他们永远都在每个人的眼前。
在一个随机遇到的有趣的事情,我在最近的一份报告由李等人从北卡罗莱纳大学需要一条中间道路单一制造者/ single-consumer队列:硬件加速软件队列。这样做,有他们想要满足四个主要标准:
- 频繁的入队和出队的任务必须尽可能的高效。硬件队列满足;不要软件队列。
- 一个实体之间的时间把东西放在队列和其他应尽可能短。再次,硬件队列可以这样做;软件队列,并非如此。
- 他们应该尽可能容易程序软件队列(数量、同步、等等)。软件队列满足这一定义;硬件队列不至少凭借自己有限的数量和大小。
- 他们必须在不改变操作系统工作。因为软件队列的工作应用程序的内存空间,他们可以这样做;硬件队列不能。
的删节版本他们所做的事情可以总结为四个主要分:
- 虽然仍在内存中实现队列,队列缓存的本地副本,尾巴,和大小在一个单独的专用硬件表。这表存储一些活跃队列的内存缓存存储一些活跃的内存地址。这意味着可以进行各种簿记步骤没有记忆,没有任何人争用。
- 管道队列操作分为三个步骤:地址生成实际的商店或负载,和索引更新。
- 使用专用硬件来计算存储或负载的地址。这发生在私人硬件不受干扰;可以生成多个地址在一个单一的操作。实际的负载或存储时可能发生的地址是准备好了,这意味着队列操作可能发生故障(如果早期它花费的时间有一个地址解决,例如)。
- 累积索引更新和存储一群人同时减少访问缓存。
当然,和其他东西一样,细节隐藏太多的恶行,所以他们有处理misspeculation特殊考虑,精确中断,一个完整的队列缓存,栅栏(内存屏障)指令,避免活锁(理论上,各种队列指标可能驻留在三个不同的内存页,一个操作系统可能无法保持在内存中同时)。
这个解决方案,则1是遇到了由于硬件加速,标准2。因为实际的队列仍然在应用程序中实现内存空间,没有具体的尺寸和数量限制,标准3和4。
所有的这些细节以及他们的测试的结果,你可以查看纸由詹姆斯·塔克,报告的作者之一。