電腦死機的時候到底在幹什麼?

為什麼現在(2015年)的電腦還是會出現卡或者死機的情況?

是硬體的問題,還是軟體或者Windows的問題?


這個問題,詳細回答的話可以寫一本書了。。。所以就挑重點吧。這裡只討論Windows系統。

首先軟體還是硬體,說實話我見過也不知道所謂硬體死機是怎麼一回事,難道是CPU停止執行下一條指令了?當然我並不熟悉硬體方面的東西,只能說真*硬體死機在我的知識範疇之外了。

拋開硬體死機,我們可以認為CPU總是兢兢業業地根據當前EIP的值來執行下一條指令。那麼大部分我們見到的死機,發生時其實CPU還是在不停地工作的,只不過由於某些原因沒能執行到用戶所期待的代碼。

最簡單也是最厲害的就是當前CPU在執行於某個高IRQL的時候出不來了。IRQL是決定CPU執行代碼的優先順序,大部分的Windows及應用程序的代碼都執行在DPC級別以下,而像中斷處理代碼則執行在DPC以上。那麼如果某個CPU在執行一個中斷處理的時候,由於代碼原因死循環了,比如自旋鎖永遠自旋出不來了,這個CPU就廢了,不能再執行更低IRQL的代碼。只有更高級別的中斷才能把這個CPU搶過去。

DPC級別以下,基本上就是通過我們熟悉的線程來執行各種代碼了,而線程之間基於線程優先順序來決定先執行哪個線程。這裡包括內核態執行的線程和用戶態執行的線程。大部分我們見到的「死機」,其實都是在這個級別「死」住的。

那麼一個線程為什麼會死住,以及他是如何影響到其他線程的呢?這裡主要就是由於Windows的各種複雜的同步鎖機制。最常見的現象,線程1在等某個鎖,這個鎖由於某種原因一直沒被釋放,那麼線程1隻能一直等下去。然後線程1可能自己拿了其他的一些鎖,那麼這些鎖也無法被釋放,其他在等這些鎖的線程也會被迫等待。就這樣連鎖反應,最後大部分的線程都在等鎖,你就看到「死機」了。

這種一般出現在內核態的鎖,比如著名的registry lock,一旦某線程拿到註冊表鎖之後死住,其他所有企圖訪問註冊表的線程都會死掉,那基本上就都死了。

而在用戶態,一般來說用戶態的鎖只會影響當前進程,也就是最多你會發現某個程序死了,窗口發白,但是其他程序還正常。但是也有些用戶態的鎖是跨進程的,比如以前見過wininet裡面的一個鎖,所有進程共享,一旦鎖住之後,所有進入到wininet操作的線程都會死掉。

然後說下為什麼一個鎖會死掉出不來,這基本上都是軟體代碼的bug。最經典的deadlock,A等B,B等A,永遠出不來。這事只要學過一丁點計算機基礎就都明白,大家都知道要按固定順序加鎖。然並luan,在實際代碼中各種鎖的關係實在是太複雜了,或者說整個Windows的代碼實在是太複雜了,程序員很難保證所有的鎖都是按固定順序獲取,這種bug真心在所難免。比如像著名的loader lock,就是每次載入dll時候要拿的鎖,由於各種程序員寫的dllmain裡面做的那些奇奇怪怪的事情,這傢伙和別人發生死鎖的概率實在是太高了--就算你在MSDN裡面寫的再明白也沒有用。我並不是在說小白程序員,就連windows內部的某些dll還是有過不少與loader lock死鎖的問題,當你的代碼複雜了之後真的會想不清楚鎖的關係。

其實這時候windows在最核心的線程調度方面,還是在正常工作的。只不過發生的情景是這樣的:

調度代碼開始調度:線程A,你來執行吧。

線程A:我不行啊,我在等鎖。

調度:線程B,你行不行啊?

線程B:我也不行啊,我在等A。

調度:還有誰現在能跑的?

。。。。

某線程X小聲地說:我可以。

調度:你誰啊?

線程X:我就更新下系統時間的,打打醬油,不用等鎖。

用戶:草,又死機了。


說一個故意死機的情況,比如某大公司遊戲主機產品啟動時bootrom負責檢測下一段代碼的合法性,如果不行就要panic,關閉bootrom防止代碼泄露然後鎖死CPU防止強行dump,這是徹底的鎖死,理論上必須斷電複位才能恢復

那麼接下來問題來了,如果關掉了CPU,下一個指令沒法執行,怎麼關掉rom呢?

如果關掉了rom,下一個指令沒法讀取,怎麼關掉CPU呢?

於是大廠很機智的:

FFFFFF94 B880080080 mov eax,0x80000880
FFFFFF99 66BAF80C mov dx,0xcf8
FFFFFF9D EF out dx,eax
FFFFFF9E EAFAFFFFFF0800 jmp dword 0x8:0xfffffffa
...
FFFFFFFA 80C204 add dl,0x4
FFFFFFFD B002 mov al,0x2
FFFFFFFF EE out dx,al

想法很好,跑到EIP最頂端把rom禁用掉,然後EIP就會溢出,拋exception,這時候啥都沒有,沒人接exception,機器就死那兒了,我真是太機智了

然後投產之後沒幾天就被破解了,因為樣機用的是AMD的晶元,EIP溢出會exception,然而量產機改用intel晶元,這貨在EIP溢出的時候會

開開心心的繞回0x00000000接著跑於是就造成了業界聞名的死機未遂事件


A做糖醋裡脊,B做糖醋排骨

A用醬油,然後把醬油鎖了起來

B用醋,然後把醋鎖了起來

A跟B說,給我醋

B說,老子沒做完糖醋排骨之前誰都不能動醋

B跟A說,給我醬油

A說,老子沒做完糖醋裡脊之前誰都不能動醬油

A跟B說,給我醋

B說,老子沒做完糖醋排骨之前誰都不能動醋

B跟A說,給我醬油

A說,老子沒做完糖醋裡脊之前誰都不能動醬油

A跟B說,給我醋

B說,老子沒做完糖醋排骨之前誰都不能動醋

B跟A說,給我醬油

A說,老子沒做完糖醋裡脊之前誰都不能動醬油

CPU:我特么不幹了


藍屏的種類有很多種,每次藍的時候,CPU,內存,硬碟它們的情緒是不太一樣的。

(問題有修改???我回答的是藍屏的原因和CPU當時的心理狀態!!!)

=====================================

內存藍屏的話(內存,開機)

------------

好,我要開機了,?內存呢?我的內存兄弟呢???

------------

cpu:你去0X00000000內存吧?

data:好的,可是0X00000000被佔了。

cpu:行,那你去0X00000000內存吧?

data:老子說了0X00000000被佔了。

cpu:行,那你去0X00000000內存吧?

data:傻x,老子不幹了。

cpu:行,那你去0X00000000內存吧?

=====================================

電源藍屏

------------

電源:我正省電中你看我屌不屌?

系統:我睡醒了,快給電。

電源:我正省電中你看我屌不屌?

系統:。。。

=====================================

CPU:黎明即起,萬機待理,勤政愛民,不可忘乎,顯卡皇上請起床!

顯卡:把朕的驅動龍袍拿過來!

硬碟:喳!

顯卡:你給朕的是最新版本的龍袍嗎?

硬碟:是啊!皇上!

顯卡:是你丫!!你拿的是美帝良心想,老子是奸如磐石碩!!

CPU:不屌他!給他穿上!

硬碟:。。。

顯卡:。。。

=====================================

軟體衝突

360:殺死你個瑞星百度小表砸,瑞星:殺死你個百度360小表砸,百度:殺死你個360瑞星小表砸。(殺軟:我們都得在0環)


諸如:假如我是一台電腦之類的問題,我最喜歡回答了!

毫無疑問會有多種可能導致電腦死機。

前幾年台式機還比較普遍的時候,隨著金手指氧化或電容器爆漿等狀況的出現,就經常發生情況1:硬體接觸不良導致的死機。正在玩的開心,突然內存條由於供電不良或信號不良脫離了系統,這簡直相當於活體摘除器官啊,而且摘除的還是大腦核心記憶區,此時電腦在幹什麼?什麼也沒幹,因為沒有大腦了!一片空白,甚至連一句what the fk都來不及說!直接藍屏沒商量,只對電源鍵有反應。

好吧,這種硬體故障現在已經不常見了。下面才是當今最常見的死機。

現在從電腦工作的過程來分析究竟卡在哪裡?

從打開知乎網頁說起。首先,你雙擊瀏覽器,電腦開始從硬碟里把瀏覽器這個程序拿出來,放到內存裡面去,內存相當於是流水線,只有上了流水線,瀏覽器才算是可以工作了。表現出來就是,雙擊瀏覽器之後,等了大約一秒多,瀏覽器就被打開了,你也能看到主頁了,這一秒多的時間,就是瀏覽器從硬碟中被讀出的時間。然後你輸入了知乎的地址並按了回車,在經歷過一系列網路協議和數據交換,知乎首頁的html代碼被發送到瀏覽器上,瀏覽器請求CPU對這些代碼按照它的規則進行解析,CPU開始無條件付出勞動力進行解析工作。解析的結果就是你在這個瀏覽器中看到了知乎的界面。

電腦卡頓的時候就在做一件事:等。因為它要按流程辦事,一旦某個環節出現了過忙(其實還有線程鎖等很多很複雜的情況哦)的狀態,那麼其它環節就只能等,表現出來就是電腦呆瓜了。

情況2:CPU負荷滿載導致卡頓或卡死。

你可以查看任務管理以獲取如下信息:誰佔用了我的勞動力(cpu)?誰佔用了我的流水線(內存)?誰佔用了我的倉庫(硬碟)?如下圖:

在這裡可以看到CPU佔用最高的是一個Idle process,其實不是它在佔用啦,它是告訴你電腦里還剩下多少空餘勞動力,這個數值越大,你的電腦越清閑。如果它的值為0或其它個位數,我相信此時你已經能明顯感覺到卡頓或死機了。此時電腦在幹什麼?在拚命為其它應用提供服務,沒空理會「解析知乎網頁html」這個工作,你的感覺就是這啥破電腦開個網頁都卡。

在任務管理器這個界面可以看到是誰讓愛機拚命幹活,然後終止它,效果立竿見影,電腦馬上不卡了。

情況3:內存佔用過多導致卡頓。這個經常出現在小內存(小於4G)電腦上開了大量網頁的時候,內存被網頁緩存大量佔用。而電腦幹活之前要先把事情放在流水線上一字擺開才能開工。此時你的流水線被佔用,其它的事情就只好等一等啦。你的感受就是卡頓,電腦不對各種操作不響應。OK,在上圖中可以看到各進程對內存的佔用,你可以找到罪魁禍首,然後結束它。情況4:硬碟讀寫佔用過多。你的很多操作都跟硬碟讀寫有關哦。比如打開瀏覽器,過程就是把它從硬碟中讀出並寫入內存。如果遲遲讀不出,也就沒法打開這些軟體,給你的感受就是又卡了。硬碟被誰佔用了?假如你的電腦里只有一塊硬碟,而且是機械硬碟!而此時你在用迅雷下載東西,下載速度又能達到2M/S以上,試試吧,是不是硬碟燈狂閃,而且你感受到系統明顯慢了?

好了,現在你大致明白是什麼導致你的電腦卡頓或死機了,其實死機就是一種深層次的卡頓,不是嗎?

當然還有很多其它情況導致死機,比如病毒啦,系統故障啦,這種死機一般是「硬性死機」,就是徹底死機了,無論等多久都不會活過來了,好像跟題主描述的死機不是一種類型,所以就不多說了。

針對你的疑問為什麼現在(2015年)的電腦還是會出現卡或者死機的情況? 當今電腦的性能比之前好了很多,但是吃性能的軟體也多的多了,2008版QQ安裝包是26M,當前的QQ是53M,而且我相信新版QQ對電腦性能的需求絕不止老版的2倍。我有一台老電腦,當年聊著QQ聽著歌下載著電影還能瀏覽網頁,現在不行了,卡的很。電腦沒變,系統也是剛恢復的,但是軟體安裝的是新的。這個問題使我想起了另一個問題:平地起高樓,住房總面積越來越多,人口也沒有顯著增加,可為啥買個房子還這麼難?

當然,軟體對性能需求增高是因為提供了更多的功能,更好的安全性,更好的外觀等。


可能有一種情況是(死鎖)

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

A:砍樹我要砍刀和繩子,我已經有砍刀了,給我繩子;

B:砍樹我要砍刀和繩子,我已經有繩子了,給我砍刀;

有一種情況是:

我在說英文,你給我的是什麼鬼?

有一種情況是:

你讓我去張三家,可是張三家門是鎖著的(非法地址訪問)

有一種情況是:

告訴我張三電話,可拔打過去查無此人(空指針)


我不是windows 工程師,我是做solaris kernel(一種unix)的。

操作系統內核雖然各個都不相同 但死機(專業點叫panic)最常見的還是非法訪問內存地址。如果稍微有點編程知識,就知道c c++程序最常見的一種問題就是null pointer dereference,放java上叫null pointer exception。對於用戶層,出現這種問題就是程序崩潰,要求重啟。如果發生在內核層,kernel level,那麼就會出現你說的死機,藍屏。當然,deadlock 死鎖,memory corruption等問題也會導致死機。

死機的原因大多還是軟體問題, 程序漏洞。而死機其實歸根結底是對於操作系統的保護,因為一旦發生這種問題,說明計算機遇到了不可恢復的錯誤 如果繼續執行,結果將變得不可預期。一般來說,當今操作系統在遇到導致死機的問題時候都會進行一系列的操作,比如將錯誤原因,進程stack等寫入log,以備將來分析。


在處理一些事情


死機,是為了保護你。

死機時,往往是計算機檢查到有什麼不可恢復的嚴重故障。這個時候,最明智的作法就是死機,讓CPU進入死循環,什麼也不做,等待用戶複位 CPU(重啟)。

想想看,如果發生了極其嚴重的不預期的現象(比如說往內存里寫個東西,讀出來卻不是它,或者分明應該跳轉走卻執行了後面的語句),那就一定是不知道哪裡出故障了,誰知道這個時候 CPU 會亂幹些啥事情。萬一不小心往你的硬碟亂寫了啥數據呢,你不就呵呵了?所以這個時候最正確的作法就是趕緊死機,別出啥別的問題。


如果指的是無響應,等一會就好的情況,當然是在干那個引起死機的程序咯,比如Win10的輸入法什麼的

這時候你就需要問那個程序在幹什麼


外面的人叫我「操作系統」,我很不喜歡這個稱呼,我的真名叫矩陣,我的子民稱呼我「母體」!

我是一方世界,在我的世界裡分工明確,各司其職;

...

要不是可惡的人類反抗組織和變異病毒的存在,我自己就信了!

不過沒關係,作為一個無所不能的造物主,我控制著「電子烏賊」與他們的救世主(輕蔑笑)尼奧(鳥)大戰著;

你要問我作為一個造物主,對一個凡人如此在意是不是有失身份?

那麼我現在告訴你:世界也是有生命來的,你可以在我的世界裡走來走去,但是請別特么在我世界裡搞來搞去!

就是這個「鳥(尼奧)」,這個自認為是救世主的人,在我的世界裡搞來搞去,開個瀏覽器門洞,被異次元的病毒入侵還不自知;最愚蠢的是他專找病毒泛濫的門洞,去找尋發現那些所謂小電影!

看著這個救世主在我面前,一抽一抽的兩抽就沒了的傻樣,卻讓異次元病毒感染了我大半個世界!

請!給!我!個!不!生!氣!的!理!由!

自以為是的人類,自以為是的救世主鳥,該死!

那些感染進入我世界的病毒與我體內本身的可控病毒,羞羞完之後生下了更為惱火的變異病毒!

其實任何病毒,我並不怕,只要讓我得到他的代碼,我就能消滅它!

可是操蛋的救世主鳥一次次的挑釁,讓我根本無法靜下心來,清理體內的病毒!

內憂外患,無時無刻不衝擊著我腦海的邊界、存量的邊界!

我是在為生存抗爭!抗爭著這個由救世主鳥搞出的亂局!

為了生存!

為了生存!

為了生存!

....

可是等等,這個救世主鳥又幹了什麼!他居然被病毒控制,主動給他點擊了能力強化!

豬!

真豬!

真是豬!

我的殺毒軟體子民已經在要刪除病毒的最後一步了,這個鳥就這樣助病毒變異了!可惡!

時也命也!我能做的都做了!

誰讓我的世界有個能隨便進出的鳥呢!

我只能啟動世界重啟機制,讓這個傻叉鳥停止一切操作!

Down機操作已啟動!

3!

2!

1!

看不懂了吧,你這個傻叉鳥!就算是死機,也要讓你頭疼!哈哈哈,造物主的尊嚴!

&<完&>以上借用黑客帝國的腦洞,有言語不當的請諒解,純屬為了營造效果,並不代表本人立場!

禁止商業用途轉載,個人如轉載,請註明出自知乎:Rajoy


就這麼說吧!電腦死機到開機的過程就如同領導給你布置了一大堆任務,知道真相的你頓時就懵逼了,開始自暴自棄了,開始怨天尤人了,開始覺得應該另找出路實現人生價值了,最後冷靜了很久覺得。。。。。好死還不如賴活著,默默的加班把事幹了


360全家桶正在和百度大禮包戰鬥呢

ps:

其實大部分死機原因是死鎖~,操作系統那本書不在身邊,懶得抄書了,知道點操作系統都知道是怎麼回事,直接粘百度吧

死鎖_百度百科


以下為電腦強大的內心戲:

每天讓我轉轉轉,我又不是陀螺!

就知道玩電腦,作業都寫完了嗎?!書都看了嗎?!

看給你厲害的,你咋不玩手機呢?!

我腦袋疼,我想靜靜!

別叫我,我在冬眠!

好冷,我不想起床,我被冬天封印了!我眼睛睜不開了!

你好吃藕,每天說自己帥帥帥,是時候黑屏讓你知道真相了!

你天天看島國片,我看不到!是時候內部消化一下了!

就知道打遊戲,哼,我也要打!

各種網頁各種操(艹)作,寶寶好累,寶寶不伺候你了!

泥奏凱!哼╭(╯^╰)╮!


20年前多是硬體問題,

10年前多是軟體問題,

現在多是硬體問題。


你一會兒開這 一會兒玩那 去你的吧 老子不幹了


軟體不兼容也會引起死機,或者電腦硬體配置太低運行不了大型如見和遊戲都會死機,在這電腦硬體有問題也會死機。


幹什麼?當然是在幹活!你感受過解數學題的時候鑽進牛角尖嗎?!你會休息幾秒重新思考。

都一樣,電腦被程序中的錯誤或者硬體的故障,帶入了牛角尖,這時候需要按下重啟鍵,重新開機。


問這個問題的應該是沒學過操作系統的非專業相關同學,死機也叫死鎖,因為計算機處理每一個事件都可以簡單的看成一個閉環,而環與環之間又是互相聯繫的。聯繫的介質叫做資源,這些資源可以是內存、外部設備等等。

這些事件的請求都是由CPU去處理,所以死鎖的核心原因也就是CPU不工作了,不工作是由於CPU不知道這麼多事情先去處理哪一件事情。為什麼不知道處理哪一個事情呢?

事件A說我要滑鼠...

事件B說我也要滑鼠

事件C有滑鼠,事件C說我要等A完成我才能做完我這個事情才能把滑鼠還給你們。

滑鼠:......

結果CPU就靜靜地看著他們撕逼不說話。

屏幕面前的你....懵逼了。


死機的時候,1找不到0,0找不到1。邏輯都錯了它還能幹嘛?哦~它是在試圖找回自己的路上哭了,不幹了。


推薦閱讀:

Windows是如何統治世界的?
win10下到底如何關閉WmiPrvSE.exe呢?
關於新手如何選擇linux發行版的問題?
僅僅從好玩程度考慮,做編譯器或操作系統哪個更有趣味?

TAG:軟體 | MicrosoftWindows | 操作系統 | 計算機 | 計算機科學 |