性能;最重要的是無論何時等待(等待HLT的IRQ,或IRQ或寫入MWAIT的內存),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。
布倫丹,非常感謝這非常豐富的概述,你肯定清除了我周圍的霧。 我正在考慮使用mon/mwait在線程和硬件之間進行同步(以避免每次中斷來自硬件後DPC出現setEvent)。 WaitForSingleObj和SetEvent的等待時間似乎比等待線程(和全局變量)中的自旋鎖要高得多,所以mwait看起來像是一箇中間點。 –