本文來自微信公眾號:編程技術(shù)宇宙 (ID:xuanyuancoding),作者:軒轅之風(fēng) O
大家好,我是軒轅。
今天花幾分鐘跟大家分享一個很有意思又能漲知識的問題:電腦死機(jī)的時候到底在干什么?
電腦死機(jī),應(yīng)該每個接觸計算機(jī)的小伙伴都經(jīng)歷過吧。
尤其是早些年,電腦配置還沒現(xiàn)在這么高的時候,多開幾個重量級應(yīng)用程序,死機(jī)就能如約而至,就算你把鍵盤上的 CTRL+ALT+DELETE 按爛了,任務(wù)管理器也出不來,最后只能默默含淚長按關(guān)機(jī)按鈕,強(qiáng)制關(guān)機(jī)。
那么,你有沒有想過,電腦在死機(jī)的時候,它到底在干嘛呢?
眾所周知,計算機(jī)的核心中樞是中央處理器 CPU。上過計算機(jī)基礎(chǔ)課程的同學(xué)都被教導(dǎo)過:CPU 是一根筋死腦筋,只知道不斷的取出指令來一條條執(zhí)行,直到關(guān)機(jī)方休。
所以理論上,死機(jī)分為兩種,一種是 CPU 罷工不干了,不再執(zhí)行下一條指令了,這屬于硬件死機(jī),不過這種情況基本不會發(fā)生。
更多的是軟件層面的死機(jī),也就是 CPU 被困在了某個地方出不來了,導(dǎo)致本該執(zhí)行的程序得不到執(zhí)行,看起來就是死機(jī)了一般。
聰明的你可能馬上想到,如果寫一個死循環(huán),把 CPU 陷在里面出不去,是不是就能死機(jī)了?比如這樣:
void dead_loop() { while (1) { ... } }
你可以試一下,會發(fā)現(xiàn)為 CPU 降溫的風(fēng)扇可能會轉(zhuǎn)起來,但計算機(jī)依舊能正常工作,并沒有死機(jī)。
死循環(huán),CPU 不是應(yīng)該一直在這里轉(zhuǎn)圈嗎?難道不會死機(jī)?
這就不得不提到一個概念:中斷。
中斷
中斷這個概念,絕對是計算機(jī)史上最偉大的發(fā)明之一。
中斷,顧名思義,用于打斷 CPU 正常的工作,讓它去執(zhí)行別處的指令程序。
操作系統(tǒng)之所以能夠掌控全局,就得益于它啟動時給 CPU 安插的一系列的中斷處理函數(shù)(比如我們最常見的時鐘中斷),好讓操作系統(tǒng)能周期性的收回 CPU 的執(zhí)行權(quán),調(diào)度別的線程來執(zhí)行。
所以,即便你某個線程進(jìn)入了死循環(huán),在你的時間片用完之后,也得乖乖交出 CPU,讓別的程序來執(zhí)行。
想用一個死循環(huán)就把電腦搞死機(jī),那自然是不可能的。
其實想來也是,如果這么容易就給你搞死機(jī)了,那這操作系統(tǒng)也太菜了吧,新手如果剛學(xué)編程,還不得一天強(qiáng)制重啟電腦十幾回?
退一萬步講,就算不考慮中斷的影響,現(xiàn)在的 CPU 大都是多核,一個線程進(jìn)入死循環(huán),但還有別的核可以參與系統(tǒng)調(diào)度,也依然不會死機(jī)。
那么回到開始的問題,那到底 CPU 被困在了哪里出不來,連中斷都拿它沒辦法呢?
其實有兩種情況:
1、中斷確實拿它沒辦法
很多人都知道中斷的概念,但很多人不知道,中斷也是有優(yōu)先級的。
這很容易理解,比如 CPU 正在執(zhí)行程序,突然發(fā)生了一個中斷事件。CPU 保存好當(dāng)前執(zhí)行的上下文,轉(zhuǎn)頭去處理這個中斷事件,但剛處理到一半兒,這時又有一個新的中斷事件來了,那 CPU 怎么辦?要不要響應(yīng)?
所以中斷也有優(yōu)先級之分,低優(yōu)先級的中斷無法打斷高優(yōu)先級的中斷。
有了這個前提來試想一下,如果由于操作系統(tǒng)內(nèi)核代碼寫的不當(dāng),在處理某個中斷的時候陷入了死循環(huán),比如自旋鎖,會發(fā)生什么?
因為在處理中斷的時候,CPU 運(yùn)行在一個很高的優(yōu)先級上,一般的中斷是無法把執(zhí)行權(quán)搶過去的,這就導(dǎo)致這顆 CPU 核心成為了“植物人”,怎么叫它都沒反應(yīng)了。
2、中斷能搶到 CPU,但發(fā)現(xiàn)沒有線程可以調(diào)度
程序員們對死鎖這個概念應(yīng)該不陌生,兩個線程 A 等待 B,B 等待 A,兩個線程互相等待對方讓步(釋放鎖),形成僵持局面,最后成為死鎖。
如果死鎖發(fā)生在應(yīng)用層面,那問題不大,最多就是兩個程序死了。但如果發(fā)生在內(nèi)核呢?
比如在 Windows 操作系統(tǒng)內(nèi)核中,就有大量的全局性的鎖,一個不小心造成死鎖,其他想要的線程都得進(jìn)入等待隊列,那就涼涼了。
引用一段另一位大神 Tim Chen 的描述(我覺得特別形象):
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。