異常控制流

2021-07-06 10:35:29 字數 1668 閱讀 2918

異常控制流

在作業系統執行程式時,作業系統會把程式具體到每條指令,利用程式指標順序執行指令以達到程式執行的目的。這些指令類似乙個集合,稱之為控制流。程式指標依次執行每條指令,稱之為控制轉移。

但是在程式執行過程中因為種種原因,程式狀態發生變化,程式指標不會依次執行這些程式指令,引起程式狀態變化的是存在於系統中的一些事件,程式狀態的變化稱為異常

什麼是異常呢?

異常既是指程式狀態的變化,程式執行時因為種種事件而導致程式不能繼續執行下一條指令轉而執行異常處理程式。異常可以分為四種型別:

1.中斷

由系統i/o發出,一般處理程式執行完,會返回到程式的下一條指令

2.陷阱

系統呼叫,一般程式執行在使用者模式下,如果呼叫了系統庫函式,這時便會產生陷阱,進入核心模式進行處理

3.故障

一般是程式發生錯誤,該錯誤是可修復的,比如浮點數異常、段錯誤、讀虛擬記憶體出錯,一般從處理程式完成後可以返回當前指令,也可以終止引起故障的程式。也有可修復的錯誤,比如讀取虛擬記憶體的錯誤,這時

系統會重新分配記憶體,然後再返回程式當前的指令繼續執行

4.終止

指不可修復的錯誤,處理程式處理完成不會將控制權交還給應用程式,而是終止它異常產生過程

異常處理過程

每個異常事件或系統庫函式都有乙個編號,在作業系統啟動時,會初始化一張異常轉移表,該錶每個條目都包含著乙個編號和異常處理程式的位址,當發生異常時,系統首先從表中找到該異常編號的條目,然後跳轉

到指定位址執行異常處理程式,待異常處理程式完成後,便將控制權交還給應用程式或終止應用程式

在作業系統中,程序是作業系統中最成功且最偉大的概念之一,異常是程序執行基礎,因為建立乙個程序得呼叫系統庫函式fork,系統發現程式呼叫了庫函式fork,便會對比異常表,找到fork函式的標號的那個條目

然後進入核心模式處理,再返回應用程式。

程序就是乙個執行中的程式的例項。常常會給我們乙個假象,作業系統只執行這個程式,整個作業系統的記憶體空間只給這個程式使用,即使系統中執行了多個程序。這兩個假象都是由邏輯控制流和私有位址空間導致 。

1.邏輯控制流

假設系統中執行了兩個程序a和b,a程序執行一段時間後,系統會認為a程序已經執行了一段時間,便會把a程序掛起,儲存a程序的上下文(a程序執行時的環境),然後把控制權交給b程序,b程序執行一會,系統又會

把控制權交給a程序,恢復a程序上下文環境,以此往復。這種現象稱之為多工。每個程序執行的時間稱之為時間片,多工也叫時間分片。時間片一般很短,使用者察覺不出,所以造成假象,只有我的程式在執行

2.私有位址空間

每個程序都有自己的執行位址空間,所以才我們認為整個系統記憶體都由我的程式在使用

系統函式錯誤處理

一般系統級函式呼叫因某些原因導致呼叫出錯,會設定errno來表明出錯原因,在程式設計時可以呼叫strerror(errno)來列印錯誤資訊。

建立乙個程序可以呼叫fork,fork會返回兩次,在父程序一次返回子程序id,子程序一次返回0.子程序會拷貝乙份父程序的位址空間,但是執行時他們都有各自的私有位址

程序終止的三種方式

1.主程式返回

2.訊號

3.呼叫exit

程序終止後沒有被父程序**資源,那麼該程序便是乙個殭屍程序,如果父程序結束,那麼這個殭屍程序會被init程序管理

可以使用wait和waitpid來**子程序資源,當waitpid第乙個引數為-1時,表示等待所有子程序結束。

異常控制流

作業系統通過使控制流程發生突變來響應系統狀態變化,這些突變就是異常控制流 exceptional control flow,ecf 異常控制處理流程 1.系統啟動時,作業系統分配和初始化一張異常表,使得索引為k的條目對應異常號為k的處理程式的位址。2.系統執行時,處理器檢測到狀態變化,確定相應的異常...

異常控制流

從給處理器加電開始,直到斷電為止,程式計數器假設乙個值的序列a 0,a 1,a n 1,其中,每個a k是某個相應的指令i k的位址。每次從a k到a k 1 的過渡稱為控制轉移。這樣的控制轉移序列叫做處理器的控制流 現代系統通過使控制流發生突變來對這些情況作出反應,這些突變稱為異常控制流 ecf ...

CSAPP 異常控制流

在一般的情況下,處理器處理的指令序列是相鄰的 順序執行 異常控制流提供了指令的跳轉,它一部分是由硬體實現的,一部分是由作業系統實現的。異常處理 在系統啟動時,作業系統分配和初始化一張稱為異常表的跳轉表 觸發異常時將從跳轉表中找到並執行相應的異常處理程式的 所謂的核心態 系統呼叫 每個系統呼叫都屬於異...