" 在上篇文章中,我們知道操作系統(tǒng)的原理是:在任何時間內(nèi),CPU有且只有一個任務(wù)在運行。如果沒有一個任務(wù)在運行,CPU在做什么的? 事實證明,這種情況非常普遍
在上篇文章中,我們知道操作系統(tǒng)的原理是:在任何時間內(nèi),CPU有且只有一個任務(wù)在運行。如果沒有一個任務(wù)在運行,CPU在做什么的?
事實證明,這種情況非常普遍,對于大多數(shù)個人計算機(jī)來說,它實際上是常態(tài):睡眠過程的進(jìn)程,都在等待某些條件喚醒,而近100%的CPU時間正在這個神秘的“空閑任務(wù)”中。事實上,如果CPU一直忙于普通用戶,那通常是有問題的,或者是惡意軟件。
為了保持設(shè)計的一致性,OS開發(fā)人員創(chuàng)建了一個空閑任務(wù),當(dāng)沒有其他工作時,該任務(wù)將被安排運行。我們在Linux 啟動過程中已經(jīng)看到,空閑任務(wù)是進(jìn)程0,它是計算機(jī)首次打開時運行的第一條指令的直接后代。它在rest_init中 初始化,其中init_idle_bootup_task初始化空閑調(diào)度類。
簡而言之,Linux支持不同的調(diào)度類,例如實時進(jìn)程,常規(guī)用戶進(jìn)程等。當(dāng)選擇進(jìn)程成為活動任務(wù)時,將按優(yōu)先級順序查詢這些類。這樣,核反應(yīng)堆控制代碼總是在Web瀏覽器之前運行。但是,這些類通常會返回NULL,這意味著它們沒有合適的運行過程 - 它們都在睡覺。但是最后運行的空閑調(diào)度類永遠(yuǎn)不會失。核偸欠祷乜臻e任務(wù)。
這一切都很好,但讓我們來看看這個空閑任務(wù)究竟在做什么。cpu_idle_loop,由開源提供:
cpu_idle_loop
while(1){ while(!need_resched()){ cpuidle_idle_call(); }
/ *
[注意:切換到其他任務(wù)。當(dāng)
再次選擇空閑任務(wù)運行時,我們將返回此循環(huán)。]
* /
schedule_preempt_disabled();
}
我已經(jīng)省略了很多細(xì)節(jié),我們稍后會仔細(xì)研究任務(wù)切換,但是如果你閱讀了代碼,你會得到它的要點:只要不需要重新安排,意味著改變活動任務(wù),留下來閑。以經(jīng)過的時間來衡量,這個循環(huán)及其在其他操作系統(tǒng)中的表兄弟可能是計算歷史中執(zhí)行最多的代碼片段。對于英特爾處理器,傳統(tǒng)上保持空閑意味著運行暫停指令:
native_halt
static inline void native_halt(void)
{
asm volatile("hlt": : :"memory");
}
hlt停止處理器中的代碼執(zhí)行并將其置于暫停狀態(tài)。奇怪的是,全世界數(shù)以百萬計的類似英特爾的CPU正在花費大部分時間停止工作,即使在他們通電的情況下也是如此。它也不是非常有效,能源明智,這導(dǎo)致芯片制造商為處理器開發(fā)更深層次的睡眠狀態(tài),從而在更長的喚醒延遲中消耗更少的功耗。內(nèi)核的cpuidle子系統(tǒng)負(fù)責(zé)利用這些節(jié)能模式。
現(xiàn)在,一旦我們告訴CPU停止或睡眠,我們需要以某種方式讓它恢復(fù)生機(jī)。如果您已閱讀上一篇文章,您可能會懷疑涉及到中斷,實際上它們也是如此。中斷會刺激CPU退出暫停狀態(tài)并恢復(fù)運行。所以把這些放在一起,這是你的系統(tǒng)在閱讀完全呈現(xiàn)的網(wǎng)頁時所做的大部分工作:
除定時器中斷外的其他中斷也會使處理器再次運行。如果你點擊一個網(wǎng)頁就會發(fā)生這種情況,例如:你的鼠標(biāo)發(fā)出一個中斷,它的驅(qū)動程序處理它,突然一個進(jìn)程可以運行,因為它有新的輸入。此時need_resched()返回true,并且啟動空閑任務(wù)以支持您的瀏覽器。
但是,本篇文章是非常發(fā)散思維。這是隨時間變化的空閑循環(huán):
在這個例子中,內(nèi)核將定時器中斷編程為每4毫秒(ms)發(fā)生一次。這是滴答期。這意味著我們每秒獲得250個滴答,因此滴答率或滴答頻率為250 Hz。這是在英特爾處理器上運行的Linux的典型值,100赫茲是另一個人群的最愛。這在CONFIG_HZ構(gòu)建內(nèi)核時在選項中定義。
現(xiàn)在看起來對于空閑CPU來說看起來像是一項非常多的毫無意義的工作,而且確實如此。如果沒有來自外界的新鮮輸入,CPU將繼續(xù)陷入這種地獄般的小睡狀態(tài),在您的筆記本電腦電池耗盡時,每秒鐘會被喚醒250次。如果這是在虛擬機(jī)中運行,我們將從主機(jī)CPU燒掉電源和有價值的周期。
這里的解決方案是動態(tài)勾選,以便當(dāng)CPU空閑時,定時器中斷被取消激活或重新編程,以便在內(nèi)核知道將要工作的地方發(fā)生(例如,進(jìn)程可能有一個定時器)在5秒內(nèi)到期,所以我們不能睡過去)。這也稱為無滴答模式。
最后,假設(shè)您在系統(tǒng)中有一個活動進(jìn)程,例如長時間運行的CPU密集型任務(wù)。這幾乎與空閑系統(tǒng)完全相同:上述圖保持大致相同,只需將一個進(jìn)程替換為空閑任務(wù),圖片就是準(zhǔn)確的。在那種情況下,每隔4毫秒中斷任務(wù)是沒有意義的:它只是操作系統(tǒng)抖動,從而減慢了你的工作量。Linux還可以在這個單進(jìn)程場景??中停止固定速率滴答,即所謂的自適應(yīng)滴答模式。最終,固定速率蜱可能會消失完全。
這對于一個帖子來說已經(jīng)足夠發(fā)散了。內(nèi)核的空閑行為是操作系統(tǒng)難題的重要組成部分,它與我們將看到的其他情況非常相似,因此這有助于我們構(gòu)建正在運行的內(nèi)核的圖片。
"美國國家航空航天局已發(fā)出近10億 Dell的新款Precision 7000系列移 蘇寧中華第一店的“倒退”顯示出 Microsoft Surface go 2已通過En 如何連接裝修工人的訂單接收平臺 這21個應(yīng)用程序是非法的! 您可 YouTube每分鐘產(chǎn)生32000美元的廣 頻頻挖角高管抱怨午夜,魅族的應(yīng) 當(dāng)場推翻原版! AI不承認(rèn)上帝, 數(shù)字基礎(chǔ)共享視頻介紹了VRS可變 北通云企業(yè)照明站,3分鐘發(fā)布一 100智能大廈 新聞:2020年13英寸Macbook Pro 閱讀對最近查詢的回應(yīng):全面推動 餐飲業(yè)的創(chuàng)新,變革和利潤保證 國家緊急響應(yīng)為2級或以下; 特斯 巴菲特:尚未找到感興趣的公司 Apple的新消息專利:重新編輯發(fā) 沒有贏得原始的跑步成績,并且沒 長鑫家用DDR4內(nèi)存芯片/顆粒處理 在原始的win10中搜索其他瀏覽器 巴菲特的Alpha:使用機(jī)器學(xué)習(xí)量 圖片預(yù)覽界面中的新增長焦點圖片 巴菲特:麝香做得很棒,但不會投 閱讀:作家座談會于5月6日啟動, 原始IOS 13.5 beta 3帶來了有關(guān) 中國人民銀行:恢復(fù)生產(chǎn)的狀況正 原裝國內(nèi)最差的手機(jī)系統(tǒng):華為的 比亞迪與華為合作! 趙長江:特 經(jīng)典gal“ MUV luv”將發(fā)布在Ste