为了表现;最重要的是,无论何时发生等待(HLT 的 IRQ,或 MWAIT 的 IRQ 或内存写入),CPU 退出其“等待”状态所需的时间。这会影响延迟 - 例如,在启动中断处理程序或实际发生任务切换之前需要多长时间。CPU 从等待状态出来的时间对于不同的 CPU 是不同的,对于同一个 CPU 上的 HLT 和 MWAIT 也可能略有不同。
这同样适用于功耗——等待时的功耗在不同的 CPU 之间可能会有很大差异(尤其是当您开始考虑诸如超线程之类的事情时);HLT 与 MWAIT 的功耗和功耗在同一 CPU 上也可能略有不同。
对于使用,它们适用于不同的情况。HLT 用于等待 IRQ,而 MWAIT 用于等待内存写入发生。当然,如果您正在等待内存写入,那么您需要决定 IRQ 是否应该中断您的等待(例如,如果您只想等待内存写入,您可以这样做)CLI
。MWAIT
然而,对于多任务系统,大多数情况下它们都只用于同一件事——在 CPU 空闲的调度程序中。在引入 MONITOR/MWAIT 之前,调度程序会在等待工作完成时使用 HLT(以减少一点功耗)。这意味着,如果另一个 CPU 解除阻塞一个任务,它不能只是将该任务放入调度程序的队列中,并且必须向 HLTed CPU 发送一个(相对昂贵的)“处理器间中断”以将其从 HLT 状态中剔除(否则当有工作可以/应该做时,CPU 将继续无所事事)。使用 MWAIT,这种“处理器间中断”(可能)是不必要的 - 您可以设置 MONITOR 以监视对调度程序队列的写入,以便将任务放入队列的行为足以导致等待的 CPU 停止等待.
也有一些研究将 MONITOR/MWAIT 用于诸如自旋锁和同步之类的事情(例如等待释放竞争锁)。这项研究的最终结果是 CPU 退出其“等待”状态所需的时间太长,并且像这样使用 MONITOR/MWAIT 会导致过多的性能损失(除非存在设计缺陷 - 例如使用自旋锁当你应该使用互斥锁时)。
我想不出任何其他原因(除了调度程序和锁定/同步)来使用 HLT 或 MWAIT。