作業系統服務
作業系統服務(operating-system services)是當你的程式提出請求時,作業系統願意替它做的有用之事——也就是櫃員窗口可供取用的「幫助菜單」。程式自己可以運算,但一旦它需要與世界互動(讀檔案、啟動另一個程式、透過網路對話),它就無法直接辦到,必須請求一項服務。熟悉這份服務菜單,就是一張很好的地圖,能看清作業系統實際上是做什麼用的,而不只是「資源管理者」這個抽象概念。
經典的服務可分成幾類。行程控制:建立、執行、等待、結束程式(讓你能啟動一個應用程式,也讓一個程式能生出幫手)。檔案與裝置輸入輸出:開啟、讀取、寫入、關閉檔案,以及從鍵盤、螢幕、磁碟等裝置讀寫,全都透過同一套統一介面。通訊:讓各自獨立的程式交換資料,無論是在同一台機器上(管線、共享記憶體、訊息傳遞)還是跨越網路(插座)。保護與安全:執行「誰能存取什麼」、檢查權限、驗證使用者。作業系統也提供一些便利,例如取得時間、錯誤回報,以及帳務(追蹤誰用了哪些資源)。程式透過系統呼叫抵達這一切。
正是這些服務,讓程式不必重新發明整個世界。少了它們,每個應用程式都得有自己的磁碟驅動程式、自己啟動其他程式的方法、自己的網路堆疊——這是不可能的負擔,也是安全的惡夢。把這些服務集中在作業系統裡,系統便能讓一份正確、受保護的實作,被所有程式共享。誠實的提醒是:服務是合約,而非魔法——作業系統決定政策(下一個由哪個程式取得 CPU、誰可以開哪個檔案),而這些政策在不同系統間可能不同,這也是為什麼同一個程式在不同作業系統上可能表現不同。
啟動一款遊戲,一次就用上好幾項服務:行程控制建立遊戲的行程、檔案輸入輸出載入它的資料、裝置輸入輸出讀取手把並在螢幕上繪圖,而保護則檢查遊戲不能碰觸其他程式的記憶體——全都透過系統呼叫提出請求。
即使是一個簡單動作,也用上行程、檔案、裝置與保護等服務。
服務定義作業系統提供什麼;系統呼叫則是程式請求它們的方式。作業系統決定服務背後的政策,所以服務保證的是一個介面,而非某個特定的速度或排程結果。