倍可親

回復: 6
列印 上一主題 下一主題

死機與內存的關係 你清楚嗎?

[複製鏈接]

1萬

主題

2萬

帖子

1萬

積分

版主

倍可親決策會員(三十九級)

Rank: 7Rank: 7Rank: 7

積分
18510
跳轉到指定樓層
樓主
2007年5月15日

  從電腦出現至今就一直被死機伴隨著,幾乎沒有誰的電腦從不遭遇死機。在使用過程中,偶爾一次死機應該算是正常現象,如果經常死機,電腦就存在一定的問題了。那麼,電腦為什麼會死機呢?有哪些因素會造成電腦死機呢?要搞清楚這些問題,首先要弄清楚,到底什麼是死機?為什麼會發生死機?

  造成死機的原因是多種多樣的,有軟體問題,有硬體問題,不過,死機的本質都是一樣的。

  早在N年前,我主持某大學計算機專業本科生畢業答辯的時候,就向某學生提出過這樣兩個問題:

  1.電腦死機的時候,CPU在幹什麼(或者說,CPU處於什麼狀態?)」

  2.在計算機中,無論指令代碼還是數據代碼,都是用二進位來表示的,請問,CPU是如何判定某二進位代碼是指令代碼還是數據代碼?其實,上面兩個問題的實質是一樣的,主要涉及到CPU是如何取得指令和如何執行指令的,把這兩個問題搞清楚了,死機的問題也就容易理解了。

  首先來看看,馮.諾依曼結構的電腦是如何取得指令、又是如何執行指令的:

  馮.諾依曼(1903~1957),匈牙利裔數學家,1945年戈德斯坦、勃克斯等人,聯名發表了一篇長達101頁紙的報告,即計算機史上著名的「101頁報告」,提出了現代計算機結構的理論模型--存儲程序計算機模型(Stored Program Computer),這就是今天計算機最基本的原理模型。

  這種結構類型計算機工作的時候,首先必須把完成工作步驟和相關的數據用二進位代碼表示出來(編寫程序),然後再把它們保存在計算機的內存中,CPU依次從內存中讀相關的指令代碼和數據進行運算,直到完成整個運算過程並輸出結果。

  要完成這樣的運算過程,人們在設計運算器(CPU)的時候,首先就要考慮的是,在一段內存中,CPU怎樣區分指令代碼和數據代碼。熟悉計算機的人都清楚,指令用來確定「做什麼」和「怎樣做」,數據是「做」的時候需要原始數。

  比如:要計算機做1+2=?中,「+」表示要做什麼和怎樣做,1和2則是做的時候需要的原始數。現在假設某CPU中,「+」用二進位「00000001」來表示,「1、2」分別用「00000001、00000010」來表示。那麼,這段程序存入內存中就是這樣的:

  XXXX1:00000001

  XXXX2:00000001

  XXXX3:00000010 前面的XXXX1 XXXX2 XXXX3表示內存的地址

  從上面可以看出,「+」指令和被加數是完全相同的,當然,這是我故意這樣假設的,但是,在實際情況中,這種情況是大量存在的。在正常情況下,CPU只能把XXXX1內存中的00000001作為指令,XXXX2內存中的00000001作為被加數才能得到正確的結果。那麼CPU如何才能做到不把第二個00000001也當成「+」呢?

  1.人們把內存的某個地址規定為起始地址(又稱為複位地址),也就是說,當計算機開機或者被強行複位(也就是機箱上那個重啟動按鈕按下的的時候),CPU立即跳轉到這個地址中,並且把它裡面的代碼作為指令來執行,同時根據這個指令的長度和格式判斷下一條指令在什麼地方。

  對於X86系列CPU(也就是現在人們常用的什麼奔XX、賽XX系列),它的複位地址是FFFF0,如果表示成邏輯地址則是:FFFF:0000。對DEBUG比較熟悉的朋友或者會在一些高級語言中嵌入彙編語言的朋友可以這樣做一個試驗:

  用DEBUG執行一條指令(這是一條無條件跳轉指令):jmp FFFF:0000,或者在高級語言中嵌入這條彙編指令,執行后,你就會發現,計算機重新啟動了。其實,用程序控制計算機重啟的最本質的操作就是這樣的。

  2.給各種指令規定了相應的長度和格式。比如:某數+某數這條指令就規定:這條指令的長度是3個位元組,其中第一個位元組表示「+」,後面兩個位元組表示被加數和加數。於是,當CPU到達這個指令后,就自動把第一個代碼作為指令,後面兩個代碼作為數據,依次類推,第4個代碼就必然是指令.....

  現在假設,CPU在執行指令的時候因某種原因,誤把本來是數據的代碼當成了指令,結果除了是計算結果出錯外死機也就是必然的了。

  還是以前面那個加法程序為例:當CPU把第三個代碼(也就是00000010)當成了指令,而恰好這個代碼是一跳轉指令,CPU的執行結果將是:XXXX3--跳轉--執行--跳轉--執行........進入周而復始的亂條,不過注意,雖然是在亂跳,CPU卻始終是在不停的正常地執行指令,所謂的「亂」是對用戶而言,對CPU來說卻是正常的。

  還有一種情況就是,如果恰好跳轉到了FFFF:0000這個地址,計算機便重新啟動了。呵呵,,這下搞清楚了為什麼計算機有時會「莫名其妙地重啟」了把。

  有朋友可能會問,內存中怎麼可能有如此多的跳轉指令呢?是怎麼形成的呢?

  計算機中的最小存儲單位是位元組(8個二進位位),指令功能、長度和格式也是在一個位元組中規定的。因此,平均來說,每256個代碼中就有可能出現一條跳轉指令(8位二進位數最多表示256)。

  還有一種情況:現在計算機的內存已經達到數G的存儲容量,絕大多數都不可能用到這個極限,也就是說,有相當長一段區域是空白,即使內存只有數百M的計算機中也不可能把內存用完,同樣存在相當數量的空白區域。特別需要注意的是,空白區域不等於裡面就沒有代碼。因為,在數字邏輯電路中,不可能存在「沒有」這種情況,即使是表示沒有(叫做「空」--NULL)也是要用一個代碼來表示的(NULL用00000000)來表示,所以,空白區域內的代碼是「11111111」或者乾脆就是一些隨機代碼。X86系列的CPU「11111111」是一條單位元組的指令nop--空操作指令,當CPU跳轉到這些空白區域時,雖然不會發生再次跳轉的現象,CPU也會逐條執行這些代碼,執行到最後一個內存后,CPU將會回到內存的0號起始地方然後又從頭開始執行程序。

  有朋友問了,如果硬碟出錯會不會死機呢?這個問題要這樣看。CPU從硬碟中調入數據的時候會對硬碟數據做比較嚴格的校驗(一般是CRC--循環冗餘校驗),如果校驗成功,則不會死機,如果校驗失敗,CPU會給予用戶提示「校驗失敗或者文件損壞」--當然也不會死機;只有在硬碟上的文件已經損壞,硬碟把數據傳給CPU的時候「自己沒有發現」造成的數據混亂。所以,硬碟數據損壞后,只能造成數據丟失,無法執行程序,也可能無法啟動計算機。不過,有一種情況例外,那就是硬碟上的某區域做成的虛擬內存,如果這個區域損壞是有可能死機。

  內存的啟動監測問題,計算機在開機的時候會對內存進行檢測,這種檢測的方法不外乎有如下一些:

  1.最簡單的檢測方法:把內存從頭到尾讀一遍,能夠讀出數據便認為內存正確。

  2.稍微複雜一些的檢測方法:把內存從頭到尾讀、寫一遍,能夠讀寫數據便認為內存正確。

  3.再複雜一些的檢測方法:把內存從頭到尾讀、寫數遍能夠讀寫數據便認為內存正確。

  4.簡單的校驗檢測方法:把內存從頭到尾讀、寫數遍,讀出的數據和寫入的數據進行比較,能夠讀寫、並且讀的數據和寫的數據相同,則認為內存正確 。

  5.比較複雜的校驗檢測方法:對內存讀寫的數據同時進行奇偶校驗和CRC校驗,這種方法多用於高檔伺服器,同時,能夠做奇偶校驗的內存(ECC內存)價格比普通內存貴10倍以上(不知道為什麼)。
我是一個熱愛自己祖國的中國人,我健康,我快樂。
細節成就完美。
圖片類未註明[原創]的均為轉帖!

7

主題

12

帖子

6

積分

註冊會員

Rank: 1

積分
6
沙發
frankfxu 發表於 2007-5-15 23:47 | 只看該作者
回復 支持 反對

使用道具 舉報

7

主題

306

帖子

76

積分

貝殼新手上路

新新移民(六級)

Rank: 2

積分
76
3
Inkel 發表於 2007-5-16 00:06 | 只看該作者
內存資源是很重要的,微軟的系統很不在乎內存,不行你就硬體升級.
微軟為代表的軟體商,與intel 為代表的硬體商聯手,號召全世界計算機用戶不斷升級,升級不停
回復 支持 反對

使用道具 舉報

358

主題

983

帖子

620

積分

貝殼網友五級

留學助教(八級)

Rank: 3Rank: 3

積分
620
4
George Shen 發表於 2007-5-16 00:17 | 只看該作者
回復 支持 反對

使用道具 舉報

0

主題

522

帖子

111

積分

貝殼網友一級

海外苦力(七級)

Rank: 3Rank: 3

積分
111
5
xyz890 發表於 2007-5-18 06:48 | 只看該作者
回復 支持 反對

使用道具 舉報

1

主題

12

帖子

4

積分

註冊會員

新手上路(初級)

Rank: 1

積分
4
6
dudu1360 發表於 2007-5-18 09:22 | 只看該作者
回復 支持 反對

使用道具 舉報

0

主題

37

帖子

7

積分

註冊會員

新手上路(初級)

Rank: 1

積分
7
7
luckyone 發表於 2007-5-18 19:41 | 只看該作者
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 註冊

本版積分規則

關於本站 | 隱私權政策 | 免責條款 | 版權聲明 | 聯絡我們

Copyright © 2001-2013 海外華人中文門戶:倍可親 (http://big5.backchina.com) All Rights Reserved.

程序系統基於 Discuz! X3.1 商業版 優化 Discuz! © 2001-2013 Comsenz Inc.

本站時間採用京港台時間 GMT+8, 2025-8-29 19:50

快速回復 返回頂部 返回列表