您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>主機(jī)配件>內(nèi)存>

電腦死機(jī)問題分析

2010年08月19日 14:51 本站整理 作者:佚名 用戶評(píng)論(0

  從電腦出現(xiàn)至今就一直被死機(jī)伴隨著,幾乎沒有誰(shuí)的電腦從不遭遇死機(jī)。在使用過(guò)程中,偶爾一次死機(jī)應(yīng)該算是正?,F(xiàn)象,如果經(jīng)常死機(jī),電腦就存在一定的問題了。那么,電腦為什么會(huì)死機(jī)呢?有哪些因素會(huì)造成電腦死機(jī)呢?要搞清楚這些問題,首先要弄清楚,到底什么是死機(jī)?為什么會(huì)發(fā)生死機(jī)?

  造成死機(jī)的原因是多種多樣的,有軟件問題,有硬件問題,不過(guò),死機(jī)的本質(zhì)都是一樣的。

  早在N年前,我主持某大學(xué)計(jì)算機(jī)專業(yè)本科生畢業(yè)答辯的時(shí)候,就向某學(xué)生提出過(guò)這樣兩個(gè)問題:

  1.電腦死機(jī)的時(shí)候,CPU在干什么(或者說(shuō),CPU處于什么狀態(tài)?)”

  2.在計(jì)算機(jī)中,無(wú)論指令代碼還是數(shù)據(jù)代碼,都是用二進(jìn)制來(lái)表示的,請(qǐng)問,CPU是如何判定某二進(jìn)制代碼是指令代碼還是數(shù)據(jù)代碼?

  其實(shí),上面兩個(gè)問題的實(shí)質(zhì)是一樣的,主要涉及到CPU是如何取得指令和如何執(zhí)行指令的,把這兩個(gè)問題搞清楚了,死機(jī)的問題也就容易理解了。

  首先來(lái)看看,馮.諾依曼結(jié)構(gòu)的電腦是如何取得指令、又是如何執(zhí)行指令的:

  馮.諾依曼(1903~1957),匈牙利裔數(shù)學(xué)家,1945年戈德斯坦、勃克斯等人,聯(lián)名發(fā)表了一篇長(zhǎng)達(dá)101頁(yè)紙的報(bào)告,即計(jì)算機(jī)史上著名的“101頁(yè)報(bào)告”,提出了現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)的理論模型--存儲(chǔ)程序計(jì)算機(jī)模型(Stored Program Computer),這就是今天計(jì)算機(jī)最基本的原理模型。

  這種結(jié)構(gòu)類型計(jì)算機(jī)工作的時(shí)候,首先必須把完成工作步驟和相關(guān)的數(shù)據(jù)用二進(jìn)制代碼表示出來(lái)(編寫程序),然后再把它們保存在計(jì)算機(jī)的內(nèi)存中,CPU依次從內(nèi)存中讀相關(guān)的指令代碼和數(shù)據(jù)進(jìn)行運(yùn)算,直到完成整個(gè)運(yùn)算過(guò)程并輸出結(jié)果。

  要完成這樣的運(yùn)算過(guò)程,人們?cè)谠O(shè)計(jì)運(yùn)算器(CPU)的時(shí)候,首先就要考慮的是,在一段內(nèi)存中,CPU怎樣區(qū)分指令代碼和數(shù)據(jù)代碼。熟悉計(jì)算機(jī)的人都清楚,指令用來(lái)確定“做什么”和“怎樣做”,數(shù)據(jù)是“做”的時(shí)候需要原始數(shù)。

  比如:要計(jì)算機(jī)做1+2=?中,“+”表示要做什么和怎樣做,1和2則是做的時(shí)候需要的原始數(shù)?,F(xiàn)在假設(shè)某CPU中,“+”用二進(jìn)制“00000001”來(lái)表示,“1、2”分別用“00000001、00000010”來(lái)表示。那么,這段程序存入內(nèi)存中就是這樣的:

  XXXX1:00000001

  XXXX2:00000001

  XXXX3:00000010 前面的XXXX1 XXXX2 XXXX3表示內(nèi)存的地址

  從上面可以看出,“+”指令和被加數(shù)是完全相同的,當(dāng)然,這是我故意這樣假設(shè)的,但是,在實(shí)際情況中,這種情況是大量存在的。在正常情況下,CPU只能把XXXX1內(nèi)存中的00000001作為指令,XXXX2內(nèi)存中的00000001作為被加數(shù)才能得到正確的結(jié)果。那么CPU如何才能做到不把第二個(gè)00000001也當(dāng)成“+”呢?

  1.人們把內(nèi)存的某個(gè)地址規(guī)定為起始地址(又稱為復(fù)位地址),也就是說(shuō),當(dāng)計(jì)算機(jī)開機(jī)或者被強(qiáng)行復(fù)位(也就是機(jī)箱上那個(gè)重啟動(dòng)按鈕按下的的時(shí)候),CPU立即跳轉(zhuǎn)到這個(gè)地址中,并且把它里面的代碼作為指令來(lái)執(zhí)行,同時(shí)根據(jù)這個(gè)指令的長(zhǎng)度和格式判斷下一條指令在什么地方。

  對(duì)于X86系列CPU(也就是現(xiàn)在人們常用的什么奔XX、賽XX系列),它的復(fù)位地址是FFFF0,如果表示成邏輯地址則是:FFFF:0000。對(duì)DEBUG比較熟悉的朋友或者會(huì)在一些高級(jí)語(yǔ)言中嵌入匯編語(yǔ)言的朋友可以這樣做一個(gè)試驗(yàn):

  用DEBUG執(zhí)行一條指令(這是一條無(wú)條件跳轉(zhuǎn)指令):jmp FFFF:0000,或者在高級(jí)語(yǔ)言中嵌入這條匯編指令,執(zhí)行后,你就會(huì)發(fā)現(xiàn),計(jì)算機(jī)重新啟動(dòng)了。其實(shí),用程序控制計(jì)算機(jī)重啟的最本質(zhì)的操作就是這樣的。

  2.給各種指令規(guī)定了相應(yīng)的長(zhǎng)度和格式。比如:某數(shù)+某數(shù)這條指令就規(guī)定:這條指令的長(zhǎng)度是3個(gè)字節(jié),其中第一個(gè)字節(jié)表示“+”,后面兩個(gè)字節(jié)表示被加數(shù)和加數(shù)。于是,當(dāng)CPU到達(dá)這個(gè)指令后,就自動(dòng)把第一個(gè)代碼作為指令,后面兩個(gè)代碼作為數(shù)據(jù),依次類推,第4個(gè)代碼就必然是指令.....

  現(xiàn)在假設(shè),CPU在執(zhí)行指令的時(shí)候因某種原因,誤把本來(lái)是數(shù)據(jù)的代碼當(dāng)成了指令,結(jié)果除了是計(jì)算結(jié)果出錯(cuò)外死機(jī)也就是必然的了。

  還是以前面那個(gè)加法程序?yàn)槔寒?dāng)CPU把第三個(gè)代碼(也就是00000010)當(dāng)成了指令,而恰好這個(gè)代碼是一跳轉(zhuǎn)指令,CPU的執(zhí)行結(jié)果將是:XXXX3--跳轉(zhuǎn)--執(zhí)行--跳轉(zhuǎn)--執(zhí)行........進(jìn)入周而復(fù)始的亂條,不過(guò)注意,雖然是在亂跳,CPU卻始終是在不停的正常地執(zhí)行指令,所謂的“亂”是對(duì)用戶而言,對(duì)CPU來(lái)說(shuō)卻是正常的。

非常好我支持^.^

(1) 33.3%

不好我反對(duì)

(2) 66.7%

( 發(fā)表人:admin )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?