我們打開電腦而沒有使用的時候,CPU是閒著的嗎?當我們點擊一個程序的時候,電腦如何快速的做出反應?大家都知道,CPU是電腦的中央處理器,CPU是不是隨時待命的呢?其實CPU閒著的時候也是有任務的!
CPU在絕大部分時間是什麼都不干的。大多數技術專家都知道這個事實,但對於CPU是如何從空閒狀態切換到工作狀態,忙完後又回到空閒狀態的相應機制,我們還沒有詳細討論過。
對現代處理器來說,這種機制變得越來越重要。今天大部分芯片設計的一個目標是將處理器盡快地切換到低功率狀態。
其實CPU空閒時並不是什麼都不干,而是在運行空閒任務(idle tasks)。
CPU整體設計就是完成當前操作後盡可能快速地返回到空閒狀態,但系統必須要有某種方法/方式來喚醒芯片,讓它去關注其他某些東西。
其中的一種方式是使用系統計時器(system timer)。
阻止CPU消耗太多電量的一種方法是內置更長的時鐘周期(tick periods)。通過這種方式,CPU在喚醒之前需要度過更長的空閒時間,然後執行基本任務,接著再次睡眠。
什麼是空閒任務(idle task)
空閒任務可能聽起來有點自相矛盾,關鍵是你要理解CPU既然通電,那麼就必須時刻不停地在運轉,即使他什麼正事也不干。
在哲學上對應的詞匯就是所謂的“忙等待”(busy waiting),本質是讓CPU不停地去計算某個條件,看看是否為true。
對於運行在x86芯片上的Windows來說,這個功能表現為暫停(HLT)指令,對應Windows的System Idle Process進程。
Windows只有在某個CPU核心沒有合適的線程可執行時,才會調用idle空閒進程去運行。
如果你查看Windows系統的任務管理器,你會看到System Idle Process(系統空閒進程)大多數時候都顯示一個較高的CPU使用百分比。和進程列表中的其他進程不同,空閒進程的值越高,代表CPU的工作量越小。
設計HLT指令的目的是為了盡可能地減少電量消耗,並使CPU進入節能模式/狀態。
HLT的歷史
HLT(暫停)指令其實有很長的歷史,在第一顆8086處理器上就已經實現了,但早期操作系統並不支持它。老程序員可能會記得,曾經有一段時間,甚至連基本的HLT功能都總是不能按預期方式執行。
回首過去的超頻年代,那時候CPU有一個基本的工具叫做Rain(雨),用來增加CPU的空閒時間(以及提升處理過程中的散熱和能耗)。隨著時間的流逝,我們可以看到硬件制造廠商和軟件開發者都變得越來越復雜。
這是Windows 8創新的一個方面——好吧,本質上只是嘗試創新——但卻產生了一些奇怪的結果。在默認情況下它允許在處理過程中有更長的間隔周期,但這也導致一些程序產生問題,如Google Chrome等程序為了更快地對用戶操作進行響應,會自動將時鐘頻率(tick rate)設置為操作系統所允許的最小值。
這個BUG在新版程序中已經修復了,但仍可能減少某些Windows 8電腦的電池續航時間。
這確實是一個可以調節時鐘周期的地方,加上要支持沒有基於晶體定時器的系統,使微軟措手不及。在Windows8中,軟件通過混合操作系統時間記錄的方式來調整前端總線速度,就會導致錯誤的基准測試結果。
這種行為在Windows 10中一直保持,盡管它只是一個小眾的問題——在操作系統產生錯誤的結果你必須調整系統前端總線的時鐘.
race-to-idle是現代CPU架構的關鍵組件,AMD和Intel基本每年都會發布新一代產品,還會經常推出更新,可能最高性能只提升那麼一點點,但通過更好的時鐘門控(clock gating)卻能顯著提高能量使用率,並更快地進行節能模式切換。