讀書筆記:《深入理解計算機系統》第八章 異常控制流

第一次作業:認識異常分類,進程的切換及狀態。

第二次作業:認識信號,非本地跳轉。

 

異常控制流是一個很寬泛的概念,我們經常提到的異常是異常控制流的一種形式,一部分由硬件實現,一部分由操作系統實現。

主要分爲4類,中斷,陷阱,故障,中止。

除了中斷是硬件方面的問題,其他都是系統方面的問題。

 

異常是允許操作系統內核提供進程概念的基本構造塊,而進程是計算機科學中最深刻,最成功的的概念之一。

在現代系統中,進程是切換執行的。舉個例子,我們一邊聽音樂一邊瀏覽網站,看起來我們是同時執行的,其實是切換執行的,那爲什麼瀏覽網站的時候音樂還在播放呢,簡單的來說是因爲系統中緩衝了一些資源。

以上的舉例是建立在單處理器的基礎上,隨着科技的發展,現在我們的電腦一般都是多核處理器,也就是說可以真的做到併發執行。

再談一下並行與併發這兩個概念,併發與處理器的個數沒有關係,只要兩個邏輯控制流有重疊或者交錯就都是併發.並行是併發的一個特例.並行是指多個處理器同時執行。

 

操作系統內核使用一種稱爲上下文切換的較高層次的異常控制流來實現多任務。程序就運行在進程的上下文中。

內核爲每個進程維持一個上下文,裏面包含了進程的一些信息。然後在進程執行的一些時刻,內核通過調度器決定當前運行哪個進程。

舉個例子,A進程正在執行,然後系統內核收到信號,中止A進程,運行B進程。過了一會,系統決定中止B進程繼續運行A進程,於是通過A進程中的上下文繼續運行A進程。

 

從程序員的角度來說,進程一般處於運行,停止,終止三個狀態之一。

父進程通過調用fork函數創建一個新的運行的子進程。新創建的子進程幾乎但不完全與父進程相同,子進程得到與父進程用戶級虛擬地址空間相同的一份副本,包括代碼和數據段,堆,共享庫以及用戶棧。

fork函數是一次調用,兩次返回,一次在調用進程(父進程)中,一次在創建的子進程中,父進程中fork會返回子進程的pid,而子進程會返回0.

除了fork函數外,還有一些與進程相關的函數。

waitpid函數功能比較多,主要是判斷並針對子進程的狀態進行一些操作。

sleep函數將一個進程掛起一段指定的時間。

execve函數在當前進程的上下文中加載並運行一個新程序,使用舊程序的地址空間。與fork一次調用返回兩次不同,execve調用一次從不返回。

 

當一個進程因爲某種原因終止時,內核並不會立即把它從系統中清楚,進程會保持在一種已終止的狀態中,等待被它的父進程收回。當被收回後,子進程就不存在的了。

一個終止了但還未被收回的進程成爲僵死進程,會佔用系統資源。

 

信號是一種更高層次的軟件形式的異常,它允許進程和內核中斷其他進程。

傳送一個信號到目的進程分爲發送信號和接受信號兩個步驟。

Unix系統提供了大量向進程發送信號的機制,而所有機制都基於進程組這個概念。

每個進程都屬於一個進程組,默認地一個子進程和它的父進程屬於一個進程組。

可以用 /bin/kill程序,鍵盤,kill函數,alarm函數發送信號。

而接受信號,一般會執行下面中的一種

(1)進程終止

(2)進程終止並轉儲內存

(3)進程掛起等待重啓

(4)進程忽略該信號

爲了使得處理程序能安全的併發執行,我們要對信號進行仔細的處理。

 

C語言中提供了一種用戶級異常控制流形式,稱爲非本地跳轉,它將控制直接從一個函數轉移到另一個正在執行的函數。Java中的try...catch也是這個原理。

 

參考

1.《深入理解計算機系統》第八章

2.【讀薄 CSAPP】伍 異常控制流  https://wdxtub.com/csapp/thin-csapp-5/2016/04/16/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章