作業系統設計/程序
程序不僅僅是程式在記憶體中的一個副本。可執行程式就像一個食譜。它是一系列計算機按順序讀取以完成任務的指令。當廚師準備菜餚時,他會閱讀食譜,收集食譜中需要的材料,並按照食譜指示將它們組合在一起。這類似於程式執行的方式。
當您在計算機上執行程式時,作業系統會收集資源(如記憶體和 CPU 時間)並開始按照可執行檔案中列出的指令進行操作。作業系統必須跟蹤它在任何給定時間執行的指令以及程式的當前狀態。所有這些資訊,包括程式本身、分配給它的資源列表及其狀態資訊,都是程序的一部分。
在多工作業系統中,如 Windows(95 及更高版本)、Linux 和 MacOS,多個程序可以由作業系統同時執行,每個程序輪流在 CPU 上執行。作業系統為每個程序分配時間在 CPU 上執行,並在它們之間快速切換,以至於它們看起來是同時執行的。MS-DOS 在 Microsoft Windows 之前,一次只執行一個程序。
程序用於執行計算機需要執行的每項任務。作業系統本身就是一個程序。它會生成(或啟動)執行顯示、與鍵盤互動、執行滑鼠並與磁碟驅動器互動的程序。使用者啟動了一些程序,例如文字處理器、電子表格、網頁瀏覽器和電子郵件客戶端。其中一些程式由多個協作程序組成;例如,一個 Web 伺服器可能有多個程序來同時處理多個傳入請求。
在設計作業系統時,重要的是程序間通訊,或 IPC。本質上,當多個程序執行並共享同一臺計算機時,有時這些程序可能需要與另一個程序通訊,或者多個程序可能需要共享相同的資源。當這種情況發生時,應注意不要建立某些危險條件,即競爭條件,其中兩個程序嘗試同時使用相同的資源。哪個速度更快就先獲得機會,但另一個程序隨後獲得下一個機會,依此類推,使資源混亂。當兩個裝置都鎖定到等待模式時,會發生死鎖,等待另一個裝置完成才能啟動,因此兩者都無法完成,其他更罕見且更難預測的錯誤也會發生,更難以除錯。
主要問題是控制程序的程序需要時間,在此期間,另一個程序可能會嘗試使用相同的資源。要併發執行多個程序,需要確保在任何時間點,只有一個程序可以訪問資源,並且在鎖定資源以供訪問時,另一個程序無法中斷處理並干擾它。防止這種情況發生的一種方法是在硬體中構建原子命令,這些命令在它們與資源的關鍵關聯時無法中斷。許多此類程序已被嘗試,包括鎖、訊號量、互斥鎖、監視器等。最新技術稱為訊息傳遞技術,它與 OOP 配合良好。
儘管執行緒有時不被認為是真正的程序,因為它們不承載完整的程序的所有負載,但使用執行緒的併發與程序間通訊一樣充滿了問題。主要區別在於執行緒不會附加完整的程序必須的所有資源。具體區別在於程序的上下文欄位。執行緒不會擁有自己的上下文,而是繼承了它們所生成的父程序的上下文,因此必須注意它們不會在沒有某種通訊同步的情況下更改其他執行緒使用的變數。
執行緒有時被稱為輕量級程序。程序和執行緒都提供執行環境,但建立新執行緒通常比建立新程序需要的資源少。
執行緒存在於程序中——每個程序至少有一個執行緒。執行緒共享程序的資源,包括記憶體和開啟的檔案。這使得通訊既高效又可能存在問題。
多執行緒執行是 Java 平臺的一項重要功能。每個應用程式至少有一個執行緒——或者如果算上執行記憶體管理和訊號處理等操作的“系統”執行緒,則有多個執行緒。但從應用程式程式設計師的角度來看,您從一個執行緒開始,稱為主執行緒。該執行緒能夠建立其他執行緒,我們將在下一節中演示。