1. 線程調度和時鐘間隔
系統時鐘間隔和另一個極重要的系統標量關聯在一起,即系統的線程調度時間。按照Windows系統的設計,線程調度時間被分為普通程序和后臺服務兩種類型。前者時間長度是2個時鐘間隔,后者時間長度是6個時鐘間隔。一旦時鐘間隔被確定,線程調度時間也就基本確定了。
OS根據平臺的不同,定義固定的最小和最大時鐘間隔。對于X86平臺而言,最小時鐘間隔是0.5ms,最大值大概是15.6001ms。在內部,時鐘間隔以100ns為單位進行表述,所以0.5ms被表示為5000個100ns單位,15.6ms被表示為156001個100ns單位。
使用ClockInterval工具可以查看/設置系統時鐘頻率(類似的工具是Sysinternal的ClockRes工具,可以查看當前值)。
線程調度時間是一個重要的系統標量,對不用功能的應用而言,它的取值具有矛盾性。如果調度時間太小,系統就會頻繁切換線程(時間片用完)而導致性能降低。而如果調度時間太長,某些對于實時性要求強的任務又無法接受。
線程調度時間和時鐘間隔的另一個關系是,系統把時鐘間隔的1/3作為線程調度的基本時間片段,也就是說,如果一個線程在運行過程中放棄剩余的時間片,則它用掉的和放棄的,都是1/3時鐘間隔的倍數。系統默認總是使用最大時鐘間隔為當前使用的時鐘頻率,時鐘間隔越大,線程就越可能在一個時間片內完成全部工作,剩下的時間片還可以還給系統重新調度。應放棄剩余時間片而產生的損失,不會操作1/3時鐘間隔。
哪些任務是屬于實時性能強的呢?音視頻軟件、實時監控軟件等。MediaPlayer是一個強實時要求的音頻軟件,筆者在本機(Win7 64)做實驗發現,每當運行MediaPlayer程序,它都會把系統時鐘頻率調低到10ms;而當退出MediaPlayer,時鐘頻率又會恢復至原值。類似的軟件還有WinAMP和魯大師,讀者有空可以實測一下,這兩款軟件會把系統時間間隔設置成1ms。
如果讀者使用這些軟件在自己的機器上未測試出類似情況,可能是由于讀者所使用的軟件版本與筆者當前所使用的不一致,筆者對此不做特殊保證。
2. 用戶程序
用戶程序控制系統時鐘間隔,所能使用的最簡單的辦法是調用Windows MMLib庫的接口函數timeBeginPeriod。與timeBeginPeriod相匹配,存在另一個接口函數timeEndPeriod。后來用來將修改后的時鐘間隔恢復到原始值。
3. 恢復時鐘間隔
前文說過應成對地使用timeBeginPeriod和timeEndPeriod函數(除非直接退出程序)。忘記調用timeEndPeriod會產生這樣的后果:以后任何程序如果要重新調試系統時鐘間隔,只能調低,不能調高。
雖然筆者編寫的軟件ClockInterval其內部并未使用timeBeginPeriod和timeEndPeriod函數,但上述規則卻同樣適用??梢杂肅lockInterval做下面的實驗:
開啟ClockInterval,假設你得到的結果和圖1相同,此時將當前時鐘間隔設置成10ms,這一定是可以成功的。
開啟另一個ClockInterval實例,此時將看到當前的時鐘間隔是10ms。嘗試將當前時鐘間隔設置成最大值15.6ms,會發現設置失敗。
關閉第一個ClockInterval實例后,再次嘗試,使用第二步中的ClockInterval實例設置最大的時鐘間隔,成功!
一般來說,在打開ClockInterval程序后,界面上顯示的當前時鐘間隔值是你所能重設的時鐘間隔的上限。點擊ClockInterval界面的test按鈕,會顯示關于此的更多信息