說說計算機中的異常


開篇

異常這個名詞應該大家都不陌生,很多人都聽說過。系統調用知道吧?其實系統調用也是一種異常。但是具體的什么是異常呢?他在計算機中有什么作用?他是如何工作,如何被我們利用的?我想很多人都還不都是很清楚。、

了解異常有諸多好處,可以讓你更好的理解操作系統和應用程序的交互,更好的理解並發等。

所以今天就簡單的來說一下異常。

 注:本博文圖片來源《Computer system-A Programmer's Perspective》

什么是異常

為了便於理解,我就不按照書本來了啊,異常可以這樣理解:

計算機執行一個連續的指令序列,如:a1,a2,a3,,,ak,這些指令執行的時候是順序執行的,相鄰的兩條指令ak,ak+1在存儲中也是相鄰的,也就是說他們是一個平滑的指令流。

而有時候這種指令流會發生突變,也就是說相鄰執行的兩條指令ak,ak+1在存儲器中是不相鄰的。造成這種突變的可能有:跳轉,函數調用,返回等。今天我們所討論的異常,也是造成這種指令流突變的原因之一。

所以異常可以認為是指令順序執行的時候,突然跳轉到別的地方執行指令。

現在就可以來看相對專業的說法了:異常是控制流中的突變,用來相應處理器狀態中的某些變化。

可以通過下圖來更好的理解上述內容:

 

 

 

那么異常處理結束后計算機中的指令如何繼續往下執行呢?根據觸發異常的種類,會有三種情況:

1)處理程序將控制返回給當前指令I currr,即當事件發生時正執行的指令。

2)將控制返回給下一條指令,即如果沒有發生異常的下一條指令。

3)終止發生異常的程序。

異常處理

 現在應該基本搞懂什么是異常了吧,發生了異常,總不能就不管吧,呵呵,有異常總是要處理的。這個部分就簡單的說一下異常處理。

按照上面所說的,異常是在指令順序執行的時候由於某些突發情況指令跳到其他地方執行。注意上面說的是“跳到其他地方執行”所以說,異常處理也是通過固定的程序代碼來實現的。至於具體的怎么實現,我們並不關心,這里要關注的是控制是如何從發生異常的程序跳轉到處理程序的。

系統中為可能的每種異常都分配了一個唯一的非負數異常號。每個異常號記錄了處理該異常的代碼。這些數據被放在一個稱為異常表的結構里,當系統初始化的時候會初始化這個表。所以當發生異常的時候,對應於異常表中的那個異常號,就能定位到具體的異常處理程序了。

下面是一個異常表:

 

 

 在系統運行時,如果發生一個異常,系統檢測得到其異常號,通過異常號,就能確定要處理的異常,同時也確定了處理異常的程序地址。異常號是到異常表的一個索引,相當於一個異常號就對應於異常表中的一項。異常表的起始地址放在一個異常表基寄存器的特殊cpu寄存器里。下面是一個生成異常處理程序地址的過程:

通過異常號和基址確定了異常表中的一個項,從而確定異常處理程序的地址。

異常的類別

什么?異常還有類別?。。。是的,在運行過程中會發生各種各樣的異常,所以就把他們分為四類:中斷(interrupt)陷阱(trap)故障(fault)終止(abort)

下面就簡單的說一下吧:

中斷:

中斷是異步發生的,是來自處理器外部的I/O設備的信號的結果。為什么是異步呢?硬件中斷不是由任何一條指令造成的,從這個意義上說是異步的。硬件中斷的異常處理程序通常也叫中斷處理程序。 

 

如圖中所示,中斷處理程序完成時,他將控制返回給下一條指令(即如果沒有發生中斷,在控制流中當前指令之后的一條指令)結果是程序繼續執行,就好像沒發生中斷一樣。

 

陷阱和系統調用

系統調用應該很多人都知道,而且經常在用,其實系統調用也是異常的一種,他是”有意“的異常。

就像中斷處理程序一樣,陷阱處理程序將程序控制返回到下一條指令。陷阱最重要的作用是在用戶程序和內核之間提供一個像過程調用一樣的接口,叫做系統調用。

用戶程序經常要像內核請求服務,比如讀一個文件(read)創建一個進程(fork)加載以新的程序(execve)等。為了讓用戶程序實現這些功能,處理器提供了一條特殊的“system call n ”指令。執行system call 指令會導致一個到異常處理程序的陷阱,這個程序對參數n 進行解碼,並調用適當的內核程序。

具體的過程如下圖所示:

 

如圖所示:陷阱處理程序將程序控制返回到下一條指令.

關於系統調用和函數調用的區別可參見前一篇文章:

linux系統調用和庫函數調用的區別

故障:

故障由錯誤情況引起,它能夠被故障處理程序修正。當故障發生時,處理器將控制轉移給故障處理程序。如果能修復錯誤,返回到引起故障的指令,重新執行它,否則終止引起故障的程序(調用abort)

 

 

 

一個經典的故障處理程序是頁缺異常。當引用到一個虛擬地址,而與該地址對應的物理頁面不在存儲器中,必須從磁盤中取出,就會發生故障。故障處理程序(這里是頁缺處理程序)會將頁面從磁盤中加載到內存中,把控制返回給引起故障的指令重新執行。當指令再次執行時,相應的物理頁面已經在內存中了,指令便可以沒有故障的運行。

 

 終止:

終止是不可恢復的致命錯誤造成的結果,通常是一些硬件錯誤。終止處理程序不會吧控制返回給引起異常的程序,處理程序會將控制返回給一個abort,然后終止這個應用程序。

 

 

 

小結

 這篇博文內容較少,理解起來也比較容易。異常在計算機中是很重要的一個概念,關於異常的東西還有很多需要學習。遇到不懂的東西,之前很喜歡google,把要搜的東西翻譯為英文然后在美國的服務器搜,各種搜索。慢慢的覺得這種學習方式還是欠妥的,上網獲取知識的速度確實是很快,可是知識的質量就參差不齊了,對於一個知識點的理解很難在網上找到滿意的解(這個或許大家也感同身受吧)相反,看書獲取知識相對慢一些,卻能得到高質量的知識。所以當你對一系列的知識點模糊不清的時候,我覺的看書的最好的。當然了,看書得看經典書。何為經典書?我認為:1)在某方面的知識點全面。2)語言方面通俗易懂。3)合理的安排了學習順序。

 

這篇博文參考了《深入理解計算機系統》,我是第二次看這個書,感覺還是很有收獲。

本書英文版下載地址:http://ishare.iask.sina.com.cn/f/24228232.html

全文完,不足之處望不吝賜教!

 

 

 

 

 

 

參看資料:computer systems

如有轉載請注明出處:http://www.cnblogs.com/yanlingyin/

一條魚、尹雁鈴@ 博客園 2012-5-05

 E-mail:yanlingyin@yeah.net

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM