提供 MONITOR 與 MWAIT 目的是爲了改善多個代理之間的同步。在含“第三代數據流單指令多數據擴充套件指令集”(SSE3) 的英特爾® 奔騰® 4 處理器的實現中,MONITOR/MWAIT 的目標是供系統軟體用於提供更有效的執行緒同步原件。MONITOR 定義用於監視寫回儲存的地址範圍。MWAIT 用於指示軟體執行緒正在等待對地址範圍(MONITOR 指令定義)的寫回儲存。
軟體應知道 MONITOR/MWAIT 要監視寫入的區域的準確長度。分配與使用的區域比處理器觸發區域的長度短時,可能會導致錯誤的喚醒(由於向錯誤地放入觸發區域的數據變數進行寫入所導致)。相反,分配的區域長度大於觸發區域時,可能會導致無法適時喚醒處理器。CPUID 可以確定觸發區域的準確長度。此長度與系統中的任何快取線大小都沒有關係,軟體不應該對它的影響作任何假設。基於 CPUID 提供的大小,操作系統/軟體應動態分配含適當填充間隙的結構。如果正確的分配導致問題,請選擇不使用 MONTIOR/MWAIT。
對於基於單個群集的系統,應該使用單個長度來滿足要求;可以預見,為包含多個群集的系統設定數據佈局會更加複雜。在這樣的系統中,根據晶片組實現的機制,單個監視快取線大小可能不足以滿足要求。
通常情況下,軟體將監視一組數據變數的寫入。確定這些變數在監視器觸發區域中的位置非常必要。為消除寫入其它變數導致的錯誤喚醒,軟體需要在監視的變數周圍新增填充間隙。這也稱為間隙區域。
另請參閱:CPUID - CPU 標識
多個事件(對觸發地址範圍的寫入除外)可能導致喚醒執行 MWAIT 的處理器。這些包括:
外部中斷:NMI、SMI、INIT、BINIT、MCERR
包括“機器檢查”在內的錯誤、終止
體系結構層面的 TLB 失效,包括寫入 CR0、CR3、CR4,以及某些 MSR 寫入
快速系統呼叫與遠呼叫導致的自行轉換
電源管理相關事件(如“溫度監視器”)或晶片組驅動的 STP-CLK# 聲言不會導致清除“監視器事件未決”位。除錯陷阱與錯誤不會導致清除“監視器事件未決”位。
下例顯示 MONITOR/MWAIT 的典型用法。
// Trigger[MONITORDATARANGE] is the memory address range that will be
// used as the trigger data range Trigger[0] = 0;
If ( trigger[0] != TRIGERRDATAVALUE) {
EAX = &trigger[0]
ECX = 0
EDX = 0
MONITOR EAX, ECX, EDX
If (trigger[0] != TRIGERRDATAVALUE ) {
EAX = 0
ECX = 0
MWAIT EAX, ECX
}
}