MONITOR/MWAIT 指導原則

提供 MONITORMWAIT 目的是爲了改善多個代理之間的同步。在含“第三代數據流單指令多數據擴充套件指令集”(SSE3) 的英特爾® 奔騰® 4 處理器的實現中,MONITOR/MWAIT 的目標是供系統軟體用於提供更有效的執行緒同步原件。MONITOR 定義用於監視寫回儲存的地址範圍。MWAIT 用於指示軟體執行緒正在等待對地址範圍(MONITOR 指令定義)的寫回儲存。

MONITOR/MWAIT 地址範圍的確定

軟體應知道 MONITOR/MWAIT 要監視寫入的區域的準確長度。分配與使用的區域比處理器觸發區域的長度短時,可能會導致錯誤的喚醒(由於向錯誤地放入觸發區域的數據變數進行寫入所導致)。相反,分配的區域長度大於觸發區域時,可能會導致無法適時喚醒處理器。CPUID 可以確定觸發區域的準確長度。此長度與系統中的任何快取線大小都沒有關係,軟體不應該對它的影響作任何假設。基於 CPUID 提供的大小,操作系統/軟體應動態分配含適當填充間隙的結構。如果正確的分配導致問題,請選擇不使用 MONTIOR/MWAIT。

對於基於單個群集的系統,應該使用單個長度來滿足要求;可以預見,為包含多個群集的系統設定數據佈局會更加複雜。在這樣的系統中,根據晶片組實現的機制,單個監視快取線大小可能不足以滿足要求。

通常情況下,軟體將監視一組數據變數的寫入。確定這些變數在監視器觸發區域中的位置非常必要。為消除寫入其它變數導致的錯誤喚醒,軟體需要在監視的變數周圍新增填充間隙。這也稱為間隙區域。

另請參閱:CPUID - CPU 標識

來自 MWAIT 的喚醒

多個事件(對觸發地址範圍的寫入除外)可能導致喚醒執行 MWAIT 的處理器。這些包括:

電源管理相關事件(如“溫度監視器”)或晶片組驅動的 STP-CLK# 聲言不會導致清除“監視器事件未決”位。除錯陷阱與錯誤不會導致清除“監視器事件未決”位。

下例顯示 MONITOR/MWAIT 的典型用法。

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

}

}