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