第八章 異常控制流linux
異常及其種類數據結構
異常:就是控制流中的突變,用來響應處理器狀態中的某些變化。併發
在處理器中,狀態被編碼爲不一樣的位和信號。狀態變化稱爲事件。事件可能和當前指令的執行沒有關係。異步
在任何狀況下,當處理器檢測到有事件發生時,它就會經過一張叫作異常表的跳轉表,進行一個間接調用異常,到一個專門設計用來處理這類事件的操做子程序(異常處理程序)函數
當異常處理程序完成處理後,根據引發異常的事件的類型,會發生如下三種狀況中的一種:編碼
1)處理程序將控制返回當前指令,即當事件發生時正在執行的指令。spa
2)處理程序將控制返回給Inext,即若是沒有發生異常將會執行的下一條指令。操作系統
3)處理程序終止被中斷的程序。設計
異常號:系統中可能的每種類型的異常都分配了一個惟一的非負整數的異常號。索引
異常表基址寄存器:異常號是到異常表中的索引,異常表的起始地址放在一個叫作異常表基址寄存器的特殊CPU寄存器裏。
異常類別:中斷,陷阱,故障和終止。
一、中斷:是異步發生的,是來自處理器外部的I/O設備的信號的結果。硬件中斷不是由任何一條專門的指令形成的,從這個意義上來講它是異步。硬件中斷的異常處理程序一般稱爲中斷處理程序。
二、陷阱:陷阱是有意的異常,是執行一條指令的結果。就像中斷處理程序同樣,陷阱處理程序將控制返回到下一條指令。陷阱最重要的用途是在用戶程序和內核之間提供一個像過程同樣的接口,叫作系統調用。
三、故障:由錯誤狀況引發,它可能可以被故障處理程序修正。當故障發生時,處理器將控制轉移給故障處理程序。若是處理程序可以修正這個錯誤狀況,它將控制返回到一塊兒引發故障的指令,從而從新執行它。不然,處理程序返回到內核中的abort例程,abort例程會終止引發故障的應用程序。
四、終止:終止時不可恢復的致命錯誤形成的結果,一般是一些硬件錯誤。終止處理程序從不將控制返回給應用程序。
進程和併發
一個獨立的邏輯控制流,它提供一個假象,好像咱們的程序獨佔地使用處理器。
一個私有的地址空間,它提供一個假象,好像咱們的程序獨佔地使用存儲器系統
併發流:一個邏輯流的執行在時間上與另外一個流重疊,這兩個流被稱爲併發地運行。
併發:多個流併發地執行的通常現象稱爲併發。一個進程和其餘進程輪流運行的概念稱爲多任務。一個進程執行它的控制流的一部分的每一時間段叫作時間片。所以多任務也叫作時間分片。
處理器一般是用某個控制寄存器中的一個模式位來提供這種功能的,該寄存器描述了進程當前享有的特權。當設置了模式位時,進程就運行在內核模式中(有時也叫作超級用戶模式)。
沒有設置模式位時,進程就運行在用戶模式中。用戶模式中的進程不容許執行特權指令。也不容許用戶模式中的進程直接引用地址空間中內核區內的代碼和數據。任何這樣的嘗試都會致使致命的保護故障。用戶程序必須經過系統調用接口間接地訪問內核代碼和數據。
linux提供了一種聰明的機制,叫作/proc文件系統,它容許用戶模式進程訪問內核數據結構的內容。
進程控制
PID:每一個程序都有一個惟一的正數(非0)進程ID。
getpid函數返回調用進程的PID。getppid函數返回它的父進程的PID(建立調用進程的進程)。兩個函數都返回一個類型爲pid_t的整數值。
運行:進程要麼在CPU上執行,要麼在等待被執行且最終會被內核調度。
中止:進程的執行被掛起,且不會被SIGSTOP、SIGTSTP、SIDTTIN或者SIGTTOU信號時,進程就中止,而且保持中止直到它收到一個SIGCONT信號,在這個時刻,進程再次開始運行。
終止:進程永遠地中止了,進程會由於三種緣由終止:1)收到信號,該信號的默認行爲是終止進程。2)從主程序返回。3)調用exit函數。
參考資料:
《深刻理解計算機操做系統》