关于MONITOR-MWAIT与HLT指令,我提出了一个奇迹。
两者都暂停处理器,都在各种外部触发器(中断等)下唤醒。

在我的实验中,考虑到以下因素,HLT和MWAIT的功能几乎相同:

  • 如果您是OS调度程序的而不是,则包含上述指令的简单循环将很快中断,并且由于MWAIT需要重新检查MONITOR和MWAIT之间的条件,所以有什么区别? (我要问的是,为什么不首先使用HLT,并省去分配跟踪区域的麻烦(如果没有仔细配置,可以避免使用mon/mwait机制,并将其变成NOP),因为如果您这样做,不是OS调度程序,没有机会您不会足够快地唤醒以仅检查HLT循环中的值... ???

  • (当然,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/

    10-11 18:41