當CPU空閑時它都在做什么?
好吧,我們來看一下這個空閑任務到底做了些什么。下面是 cpuidleloop,感謝開源能讓我們看到它的代碼:
while (1) {
while(!need_resched()) {
cpuidle_idle_call();
}
/*
[Note: Switch to a different task. We will return to this loop when the idle task is again selected to run.]
*/
schedule_preempt_disabled();
}
cpuidleloop
我省略了很多的細節,稍后我們將去了解任務切換,但是,如果你閱讀了這些源代碼,你就會找到它的要點:由于這里不需要重新調度(即改變活動任務),它一直處于空閑狀態。以所經歷的時間來計算,這個循環和其它操作系統中它的“堂兄弟們”相比,在計算的歷史上它是運行的最多的代碼片段。對于 Intel 處理器來說,處于空閑狀態意味著運行著一個 halt 指令:
static inline void native_halt(void)
{
asm volatile("hlt": : :"memory");
}
native_halt
hlt 指令停止處理器中的代碼執行,并將它置于 halt 的狀態。奇怪的是,全世界各地數以百萬計的 Intel 類的 CPU 們花費大量的時間讓它們處于 halt 的狀態,甚至它們在通電的時候也是如此。這并不是高效、節能的做法,這促使芯片制造商們去開發處理器的深度睡眠狀態,以帶來著更少的功耗和更長休眠時間。內核的 cpuidle 子系統 是這些節能模式能夠產生好處的原因。
現在,一旦我們告訴 CPU 去 halt(睡眠)之后,我們需要以某種方式讓它醒來。如果你讀過 上篇文章《你的操作系統什么時候運行?》 ,你可能會猜到中斷會參與其中,而事實確實如此。中斷促使 CPU 離開 halt 狀態返回到激活狀態。因此,將這些拼到一起,下圖是當你閱讀一個完全呈現的 web 網頁時,你的系統主要做的事情:
除定時器中斷外的其它中斷也會使處理器再次發生變化。如果你再次點擊一個 web 頁面就會產生這種變化,例如:你的鼠標發出一個中斷,它的驅動會處理它,并且因為它產生了一個新的輸入,突然進程就可運行了。在那個時刻, need_resched() 返回 true,然后空閑任務因你的瀏覽器而被踢出而終止運行。
如果我們呆呆地看著這篇文章,而不做任何事情。那么隨著時間的推移,這個空閑循環就像下圖一樣:
在這個示例中,由內核計劃的定時器中斷會每 4 毫秒發生一次。這就是滴答tick周期。也就是說每秒鐘將有 250 個滴答,因此,這個滴答速率(頻率)是 250 Hz。這是運行在 Intel 處理器上的 Linux 的典型值,而其它操作系統喜歡使用 100 Hz。這是由你構建內核時在 CONFIG_HZ 選項中定義的。
對于一個空閑 CPU 來說,它看起來似乎是個無意義的工作。如果外部世界沒有新的輸入,在你的筆記本電腦的電池耗盡之前,CPU 將始終處于這種每秒鐘被喚醒 250 次的地獄般折磨的小憩中。如果它運行在一個虛擬機中,那我們正在消耗著宿主機 CPU 的性能和寶貴的時鐘周期。
責任編輯:任我行
-
碳中和戰略|趙英民副部長致辭全文
2020-10-19碳中和,碳排放,趙英民 -
兩部門:推廣不停電作業技術 減少停電時間和停電次數
2020-09-28獲得電力,供電可靠性,供電企業 -
國家發改委、國家能源局:推廣不停電作業技術 減少停電時間和停電次數
2020-09-28獲得電力,供電可靠性,供電企業
-
碳中和戰略|趙英民副部長致辭全文
2020-10-19碳中和,碳排放,趙英民 -
深度報告 | 基于分類監管與當量協同的碳市場框架設計方案
2020-07-21碳市場,碳排放,碳交易 -
碳市場讓重慶能源轉型與經濟發展并進
2020-07-21碳市場,碳排放,重慶
-
兩部門:推廣不停電作業技術 減少停電時間和停電次數
2020-09-28獲得電力,供電可靠性,供電企業 -
國家發改委、國家能源局:推廣不停電作業技術 減少停電時間和停電次數
2020-09-28獲得電力,供電可靠性,供電企業 -
2020年二季度福建省統調燃煤電廠節能減排信息披露
2020-07-21火電環保,燃煤電廠,超低排放
-
四川“專線供電”身陷違法困境
2019-12-16專線供電 -
我國能源替代規范法律問題研究(上)
2019-10-31能源替代規范法律 -
區域鏈結構對于數據中心有什么影響?這個影響是好是壞呢!