20165232 第七週學習總結
阿新 • • 發佈:2018-11-10
第七週學習總結
第八章 異常控制流
異常
- 異常就是控制流中的突變,如圖
- 在處理器中,狀態被編碼為不同的位和訊號。狀態變化稱為事件
- 處理器檢測到異常事件發生時,會進行一個間接過程呼叫。
- 當異常處理程式完成處理後,根據引起異常的事件的型別,會發生以下三種情況的一種:
- 處理程式將控制返回給當前指令Icurr,即當事件發生時正在執行的指令。
- 處理程式將控制返回給Inext,即如果沒有發生異常將會執行的下一條指令。
- 處理程式終止被中斷的程式。
異常處理
- 如圖,若處理器檢測到發生一個事件,並確定相應的異常號k,處理器執行間接過程呼叫,通過異常表的表目k,轉到相應處理程式。
- 異常與過程呼叫的不同之處
- 過程呼叫時,在跳轉到處理器之前,處理器將返回地址壓入棧中。然而,根據異常的型別,返回地址要麼是當前指令,要麼是下一條指令。
- 處理器把一些額外的處理器狀態壓入棧裡,在處理程式返回時,重新開始被中斷的程式會需要這些狀態。
- 如果控制從一個使用者程式轉移到核心,那麼所有這些專案都被壓到核心棧中,而不是壓到使用者棧中。
- 異常處理程式執行在核心模式下,它們對所有的系統資源都有完全的訪問許可權。
異常的類別
- 中斷:如圖便是一箇中斷處理
- 陷阱和系統呼叫
- 陷阱最重要的用途是在使用者程式和核心之間提供一個像過程一樣的介面,叫做系統呼叫。
- 陷阱是有意的異常,最重要的用途是在使用者程式和核心之間提供一個向過程一樣的介面,叫做系統呼叫。
- 為了允許核心服務的受控訪問,使用“syscall n”指令,跳轉到一個異常處理程式的陷阱,處理程式對引數解碼並呼叫適當的核心程式。
故障
- 故障是由錯誤情況引起的。
例如:abort例程會終止引起故障的應用程式。 根據故障是否能夠被修復,故障處理程式重新執行引起故障的指令,或者終止。 - 終止
程序
- 程序的經典定義:一個執行中程式的例項
- 系統中的每個程式都是定義在執行在某個程序的上下文中的。
- 程序提供給應用程式的關鍵抽象:
- 一個獨立的邏輯控制流,獨佔地使用處理器;
- 一個私有的地址空間,它提供一個假象,就想程式獨佔地使用儲存器系統。
併發流
- 併發:多個流併發地執行的一般現象。
- 多工:一個程序和其他程序輪流執行。
- 時間片:一個程序執行他的控制流的一部分的每一時間段。
- 時間分片:多工。
程序控制
獲取程序ID
- 每個程序都有一個唯一的正數(非零)程序ID(PID)。
pid_t getpid(void); /*返回呼叫程序的PID*/
pid_t getppid(void); /*返回父程序的PID*/
- getpid和getppid函式返回一個型別為pid_t的整數值,linux系統上它在types.h中被定義為int。
回收子程序
- 判定等待集合的成員
- pid>0,等待集合是一個單獨子程序。
- pid=-1,就是由父程序的所有子程序組成的。
- 修改預設行為
- 可以通過將options設定為常量WNOHANG,WUNTRACED,WCONTINUED的各種組合來修改。
- 檢查已回收子程序的退出狀態
利用fork和exec執行程式
兩個重要命令
man -k key1 | grep key2| grep 2 : 根據關鍵字檢索系統呼叫
grep -nr XXX /usr/include :查詢巨集定義,型別定義