1.異常
- 異常是異常控制流的一種形式,它一部分由硬件實現,一部分由操作系統實現。
- 異常就是控制流中的突變,用來響應處理器狀態中的某些變化
- 在任何情況下,當處理器檢測到有事件發生時,它就會通過一張叫做異常表的跳轉表,進行一個間接過程調用(異常),調用後,會發生以下3中情況中的一種:
- 處理程序將控制返回給當前指令
- 處理程序將控制返回給下一條指令
- 處理程序終止被中斷的程序
- 系統中可能的每種類型的異常都分配了一個唯一的負整數的異常號。 其中一些號碼是由處理器的設計者分配的(被零除、缺頁、內存訪問、斷點以及算數溢出),其他號碼是由操作系統內核的設計者分配的(系統調用和來自外部I/0設備的信號)。
- 在系統啓動時,操作系統分配和初始化一張異常表。
異常表的起始地址放在一個叫做異常表基址寄存器的特殊CPU寄存器裏。 - 異常和過程調用的不同之處:
- 異常的類別
- 中斷:是異步發生的,是來自處理器外部的I/O設備的信號的結果。硬件中斷的異常處理程序常常被稱爲中斷處理程序
- 陷阱和系統調用:陷阱是有意的異常,是執行一條指令的結果。陷阱最重要的用途的就是系統調用(讀文件,創建進程,加載新的程序或終止當前進程等)
普通函數調用和系統調用時不同的:一個運行在用戶模式下,一個運行在內核模式下。 - 故障:故障由錯誤情況引起,它可能能夠被故障處理程序修正,也能終止
經典的故障示例就是缺頁異常。 - 終止:不可恢復的致命錯誤造成的結果,通常是一些硬件錯誤。
2.進程
- 異常是允許操作系統內核提供進程概念的基本構造塊
- 進程的經典定義就是一個執行中程序的實例。系統中的每個程序都運行在某個進程的上下文中。上下文是由程序正確運行所需的狀態組成的。包括內存中的程序的代碼和數據等。
- 進程提供給應用程序的關鍵抽象:
- 一個獨立的邏輯控制流,它提供一個假象,好像我們的程序獨佔地使用處理器
- 一個私有的地址空間,它提供一個假象,好像我們的程序獨佔地使用內存系統
- 邏輯控制流
- 併發流:一個邏輯流的執行時間上與另一個流重疊,稱爲併發流,這兩個邏輯流被稱爲併發地運行。
- 多個流併發執行的一般現象被稱爲併發。一個進程和其他進程輪流運行的概念稱爲多任務。一個進程執行它的控制流的一部分的每一時間段叫做時間片。
- 併發流不是並行,和計算機核數無關。如果兩個流併發地運行在不同的處理器核或計算機上,叫做並行流。
- 私有地址空間:進程爲每個程序提供它自己的私有地址空間。一般而言,和這個空間中某個地址相關聯的那個內存字節是不能被其他進程讀或者寫的。
- 用戶模式和內核模式:處理器通常是用某個控制寄存器中的一個模式位來提供這種功能的,該寄存器描述了進程當前享有的特權。當設置了模式位,進程就運行在內核模式中,可以執行指令集的任何指令,訪問系統中的任何內存位置。
- 上下文切換:操作系統內核使用一種稱爲上下文切換的較高層形式的異常控制流來實現多任務。
內存爲每個進程維持一個上下文。上下文就是內核重新啓動一個被搶佔的進程所需的狀態。它由一些對象的值組成,這些對象包括通用目的寄存器、浮點寄存器、程序計數器、用戶棧、狀態寄存器、內核棧和各種內核數據結構。 - 在進程執行的某一個時刻,內核可以決定搶佔當前進程,並重新開始一個先前被強佔的進程。這種決策就叫做調度。