系統呼叫大致可分為六大類:
進程控制(process control)、
檔案管理(file manipulation)、
裝置管理(device manipulation)、
資訊維護(information maintenance)、
通訊(communication) 和
保護(protection)。
進程控制
執行程式應能正常(end())或異常(abort())停止執行。如果一個系統呼叫異常停止當前執行的程式,或者程式執行遇到問題並引起錯誤陷阱,那麼有時轉儲記憶體到磁碟,並生成錯誤資訊。記憶體資訊轉儲到磁碟後,可用偵錯程式(debugger)來確定問題原因(偵錯程式為系統程式,用以幫助程式設計師發現和糾正錯誤(bug))。
無論是正常情況還是異常情況,作業系統都應將控制轉到呼叫命令解釋程式。命令解釋程式接著讀入下個命令。對於互動系統,命令解釋程式只是簡單讀入下個命令,而假定使用者會採取合適命令以處理錯誤。對於 GUI 系統,彈出視窗可用於提醒使用者出錯,並請求指引。對於批次處理系統,命令解釋程式通常終止整個作業,並繼續下個作業。當出現錯誤時,有的系統可能允許特殊的恢復操作。
如果程式發現輸入有錯並且想要異常終止,那麼它也可能需要定義錯誤級別。錯誤越嚴重,錯誤引數的級別也越高。通過將正常終止的錯誤級別定義為 0,可以把正常和異常終止放在一起處理。命令解釋程式或後面的程式可以利用這種錯誤級別來自動確定下個動作。
執行一個程式的進程或作業可能需要載入(load())和執行(execute())另一個程式。這種功能允許命令解釋程式來執行一個程式,該命令可以通過使用者命令、滑鼠點選或批次處理命令來給定。一個有趣的問題是:載入程式終止時會將控制返回到哪裡?與之相關的問題是:原有程式是否失去或儲存了,或者可與新的程式一起並行執行?
如果新程式終止時控制返回到現有程式,那麼必須儲存現有程式的記憶體映像。因此,事實上建立了一個機制,以便一個程式呼叫另一個程式。如果兩個程式並行繼續,那麼也就建立了一個新作業或進程,以便多道執行。通常,有一個系統呼叫專門用於這一目的(create_process() 或 submit_job())。
如果建立了一個新的作業或進程或者一組作業或進程,那麼我們應能控制執行。這種控制要能判定和重置進程或作業的屬性,包括作業的優先順序、最大允許執行時間等(get_ process_attributes() 和 set_process_attributes())。如果發現建立的進程或作業不正確或者不再需要,那麼也要能終止它(terminate_process())。
建立了新的作業或進程後,可能要等待其執行完成,也可能要等待一定時間(wait_time())。更有可能要等待某個事件的出現(wait_event())。當事件出現時,作業或進程就會響應(signal_event())。
通常,兩個或多個進程會共用資料。為了確保共用資料的完整性,作業系統通常提供系統呼叫,以允許一個進程鎖定(lock)共用資料。這樣,在解鎖之前,其他進程不能存取該資料。通常,這樣的系統呼叫包括 acquire_lock() 和 release_lock()。這類系統呼叫用於協調並行進程,將在後續章節詳細討論。
進程和作業控制差異很大,這裡通過兩個例子加以說明:一個涉及單任務系統,另一個涉及多工系統。
MS-DOS 作業系統是個單任務的系統,在計算機啟動時它就執行一個命令解釋程式(圖 1a)。由於 MS-DOS 是單任務的,它採用了一種簡單方法來執行程式而且不建立新進程。它載入程式到記憶體,並對自身進行改寫,以便為新程式提供盡可能多的空間(圖 1b)。
圖 1 MS-DOS 執行狀態