20155311《信息安全系統設計基礎》第14周學習總結
阿新 • • 發佈:2017-12-25
間接 進程替換 cpu bubuko 描述符 特點 處理器 markdown ()
20155311《信息安全系統設計基礎》第14周學習總結
教材學習內容總結
第八章-異常控制
異常
- 異常是異常控制流的一種形式,它一部分是由硬件實現的,一部分是有操作系統實現的。
- 異常:控制流中的突變,用來響應處理器狀態中的某些變化。
- 在處理器中,狀態被編碼為不同的位和信號。狀態變化成為事件。
- 異常表:當處理器監測到有時間發生時,通過一張叫做異常表的跳轉表,進行一個間接過程調用,到一個專門設計用來處理這類事件的操作系統子程序(異常處理程序)。
- 當異常處理程序完成處理後,根據引起異常的事件的類型,會發生以下三種情況的一種:
- 處理程序將控制返回給當前指令Icurr,即當事件發生時正在執行的指令。
- 處理程序將控制返回給Inext,即如果沒有發生異常將會執行的下一條指令。
- 處理程序終止被中斷的程序。
- 異常號:到異常表中的索引
- 異常表基址寄存器:異常表的起始地址存放的位置。
- 異常的分類:中斷、陷阱、故障和終止。
- 中斷:異步發生,是來自處理器外部的I/O設備的信號的結果。 硬件異常中斷處理程序通常稱為中斷處理程序。
- 陷阱和系統調用:
陷阱最重要的用途是在用戶程序和內核之間提供一個像過程一樣的接口,叫做系統調用。 - 故障:是由錯誤情況引起的。
- 終止:是不可恢復的致命錯誤造成的結果,通常是一些硬件錯誤。終止處理程序從不將控制返回給應用程序。
0~31號:由intel架構師定義的異常;32~255號:操作系統定義的中斷和陷阱。每一個系統調用都有一個唯一的整數號,對應於一個到內核中跳轉表的偏移量。
進程
- 異常是允許操作系統提供進程的概念所需要的基本構造塊。
進程:一個執行中的程序的實例。 - 上下文是由程序正確運行所需要的狀態組成的,這個狀態包括存放在存儲器中的程序的代碼和數據,它的棧、通用目的寄存器的內容、程序計數器、環境變量以及打開文件描述符的集合。
- 進程提供給應用程序的關鍵抽象:
- 一個獨立的邏輯控制流,獨占地使用處理器;
- 一個私有的地址空間,獨占地使用存儲器系統。
- 並發流:一個邏輯流的執行在時間上與另一個流重疊。
- 並發:多個流並發地執行的一般現象。
- 多任務:一個進程和其他進程輪流運行的概念。
- 時間片:一個進程執行它的控制流的一部分的每一時間段。
並行流:如果兩個流並發的運行在不同的處理器核或者計算機上
用戶模式和內核模式
- 模式位:用某個控制寄存器中的一個位模式,限制一個應用可以執行的指令以及它可以訪問的地址空間範圍。
- 設置了位模式,進程就運行在內核模式中,一個運行在內核模式中的進程可以中興指令集中的任何指令,而且可以訪問系統中任何存儲器位置。
- 用戶程序必須通過系統調用接口間接的當問內核代碼和數據。
- 進程從用戶模式變為內核模式的唯一方法是通過諸如中斷、故障、或者陷入系統調用這樣的異常。
- 上下文切換
- 上下文就是內核重新啟動一個被搶占的進程所需的狀態。
- 上下文切換機制: 保存當前進程的上下文, 恢復某個先前被搶占的進程被保存的上下文, 將控制傳遞給這個新恢復的進程。
- 引起上下文切換的情況
- 當內核代表用戶執行系統調用時
中斷時也可能引起上下文切換。如,定時器中斷。 調度:內核可以決定搶占當前進程,並重新開始一個先前被搶占的進程。有內核中稱為調度器的代碼處理的。
進程控制
- 獲取進程ID
每個進程都有一個唯一的正數的進程ID。 - 進程的三種狀態
運行:進程要麽在CPU上執行,要麽在等待被執行且最終會被內核調度。
停止:程序的執行被掛起,,且不會被調度。
終止:進程用永遠停止了。終止原因:(1)收到一個信號,默認行為是終止進程(2)從主進程返回(3)調用exit函數。
- 父進程通過調用fork函數創建一個新的運行的子進程。
- 子進程和父進程的異同:
- 異:有不同的PID
- 同:用戶級虛擬地址空間,包括:文本、數據和bss段、堆以及用戶棧。任何打開文件描述符,子進程可以讀寫父進程中打開的任何文件。
- fork函數: 因為父進程的PID總是非零的,返回值就提供一個明確的方法來分辨程序是在父進程還是在子進程中執行。
- fork函數的特點:
- 調用一次,返回兩次
- 並發執行
- 相同的但是獨立的地址空間
共享文件
回收子進程
- 當父進程回收已終止的子進程時,內核將子進程的退出狀態傳遞給父進程,然後拋棄已終止的進程。 一個終止了但還未被回收的進程稱為僵死進程。
- 一個進程可以通過調用waitpid函數來等待它的子進程終止或者停止。
~~~ - #include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);//返回:若成功,返回子進程的PID;若WNOHANG,返回0;若其他錯誤,返回-1
~~~ - 修改默認行為,通過options設置: WNOHANG:默認行為是掛起調用進程。 WUNTRACED:默認行為是只返回已終止的子進程。 WNOHANG|WUNTRACED:立即返回,如果等待集合中沒有任何子進程被停止或者已終止,那麽返回值為0,或者返回值等於那個被停止或者已經終止的子進程的PID。
錯誤條件: 若調用進程沒有子進程,那麽waitpid返回-1,並且設置errno為ECHILD; 若waitpid函數被一個信號中斷,那麽返回-1,並設置errno為EINTR
信號
- 信號術語
- 發送信號的兩個不同步驟:
- 發送信號:內核通過更新目的進程上下文中的某個狀態,發送(遞送)一個信號給目的進程。
- 接收信號:信號處理程序捕獲信號的基本思想。
- 發送信號的兩個原因: 內核監測到一個系統事件,比如被零除錯誤或者子進程終止。 一個進程調用了kill函數,顯式地要求內核發送一個信號給目的進程。一個進程可以發送信號給它自己。
- 待處理信號:一個只發出而沒有被接收的信號
- 一個進程可以有選擇性地阻塞接收某種信號。 待處理信號不會被接收,直到進程取消對這種信號的阻塞。
一個待處理信號最多只能被接受一次,pending位向量:維護著待處理信號集合,blocked向量:維護著被阻塞的信號集合。 - 發送信號
- 進程組:每個進程都只屬於一個進程組,進程組是由一個正整數進程組ID來標識的。getpgrp函數返回當前進程的進程組ID:默認地,一個子進程和它的父進程同屬於一個進程組。 用/bin/kill/程序發送信號:一個為負的PID會導致信號被發送到進程組PID中的每個進程。 從鍵盤發送信號:作業:表示對一個命令行求值而創建的進程。外殼為每個作業創建一個獨立的進程組。
- 用kill函數發送信號: 進程通過調用kill函數發送信號給其他的進程。父進程用kill函數發送SIGKILL信號給它的子進程。
- 用alarm函數發送信號:在任何情況下,對alarm的調用都將取消任何待處理的鬧鐘,並且返回任何待處理的鬧鐘在被發送前還剩下的秒數。 接收信號
- 當一個程序要捕獲多個信號時,一些細微的問題就產生了。
- 待處理信號被阻塞。Unix信號處理程序通常會阻塞當前處理程序正在處理的類型的待處理信號。
- 待處理信號不會排隊等待。任意類型至多只有一個待處理信號。因此,如果有兩個類型為K的信號傳送到一個目的進程,而由於目的進程當前正在執行信號K的處理程序,所以信號K時阻塞的,那麽第二和信號就簡單地被簡單的丟棄,他不會排隊等待。
- 系統調用可以被中斷。像read、wait和accept這樣的系統調用潛在地會阻塞進程一段較長的時間,稱為慢速系統調用。在某些系統中,當處理程序捕獲到一個信號時,被中斷的慢速系統調用在信號處理程序返回時不再繼續,而是立即返回給用戶一個錯誤的條件,並將errno設置為EINTR。
- Signal包裝函數設置的信號處理程序的信號處理語義:
- 只有這個處理程序當前正在處理的那種類型的信號被阻塞
- 和所有信號實現一樣,信號不會排隊等候
- 只要有可能,被中斷的系統調用會自動重啟。
一旦設置了信號處理程序,它就會一直保持,知道signal帶著handler參數為SIG_IGN或者SIG_DFL被調用。
代碼學習
- exec函數族
- fork()函數通過系統調用創建一個與原來進程(父進程)幾乎完全相同的進程,在fork後的子進程中使用exec函數族,可以裝入和運行其它程序(子進程替換原有進程,和父進程做不同的事),fork創建一個新的進程就產生了一個新的PID,exec啟動一個新程序,替換原有的進程,因此這個新的被exec執行的進程的PID不會改變。
- exec函數族裝入並運行程序path/file,並將參數arg0(arg1, arg2, argv[], envp[])傳遞給子程序,出錯返回-1。
- 在exec函數族中,後綴l、v、p、e指定函數將具有某種操作能力
- exec1.c中execvp()會從PATH 環境變量所指的目錄中查找符合參數file 的文件名,找到後便執行該文件,然後將第二個參數argv傳給該欲執行的文件如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中exevp函數調用成功沒有返回,所以沒有打印出“* * * ls is done. bye”這句話
20155311《信息安全系統設計基礎》第14周學習總結