关于MONITOR-MWAIT与HLT指令,我提出了一个奇迹。
两者都暂停处理器,都在各种外部触发器(中断等)下唤醒。
在我的实验中,考虑到以下因素,HLT和MWAIT的功能几乎相同:
(当然,MWAIT可能具有更高的分辨率,我还没有测量分辨率,但是似乎由于(我假设)中断等原因而导致唤醒过度)。因此,我看不到它的巨大优势。
谢谢,
以这种方式的任何想法将不胜感激
最佳答案
为了表现;最重要的是,无论发生什么等待(发生针对HLT的IRQ,或者针对MWAIT的IRQ或内存写入),CPU脱离其“等待”状态所花费的时间。这会影响延迟-例如启动中断处理程序或实际发生任务切换之前需要多长时间。对于一个不同的CPU,CPU退出等待状态所花费的时间是不同的,并且同一CPU上的HLT和MWAIT可能也略有不同。
功耗同样如此-等待时的功耗在不同的CPU之间可能相差很大(尤其是当您开始考虑诸如超线程之类的事情时);在同一CPU上,HLT与MWAIT的功耗也可能略有不同。
对于用途,它们旨在用于不同的情况。 HLT用于等待IRQ,而MWAIT用于等待存储器写入。当然,如果您正在等待内存写入发生,则需要确定IRQ是否中断您的等待(例如,如果您只想等待内存写入,则可以先执行CLI
,再执行MWAIT
)。
但是,对于多任务系统,大多数情况下它们都只用于同一事物-在CPU空闲的调度程序中。在引入MONITOR/MWAIT之前,调度程序会在等待工作进行时使用HLT(以减少功耗)。这意味着,如果另一个CPU解除阻止任务,它不能只是将该任务放入调度程序的队列中,而必须向HLTed CPU发送(相对昂贵的)“处理器间中断”以将其从HLT状态中剔除(否则)当CPU可以/应该执行的工作时,CPU将不执行任何操作。使用MWAIT,此“处理器间中断”(可能)是不必要的-您可以将MONITOR设置为监视对调度程序队列的写入,因此将任务放入队列的行为足以使等待的CPU停止等待。
对于将MONITOR/MWAIT用于自旋锁和同步(例如,等待竞争的锁被释放),也已有一些研究。这项研究的最终结果是,CPU退出“等待”状态所花费的时间太长,并且这样使用MONITOR/MWAIT会导致过多的性能损失(除非存在设计缺陷,例如使用自旋锁当您应该使用互斥锁时)。
我无法想到使用HLT或MWAIT的其他任何原因(除了调度程序和锁定/同步之外)。
关于assembly - MWAIT vs HALT的效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13465422/