## 進程與程序的區別與聯系
1) 進程是程序及其數據在計算機上的一次運行活動,是一個動態的概念。進程的運行實體是程序,離開程序的進程沒有存在的意義。從靜態角度看,進程是由程序、數據和進程控制塊(PCB)三部分組成的。而程序是一組有序的指令集合,是一種靜態的概念。
2) 進程是程序的一次執行過程,它是動態地創建和消亡的,具有一定的生命周期,是暫時存在的;而程序則是一組代碼的集合,它是永久存在的,可長期保存。
3) 一個進程可以執行一個或幾個程序,一個程序也可以構成多個進程。進程可創建進程,而程序不可能形成新的程序。
4) 進程與程序的組成不同。進程的組成包括程序、數據和PCB。
## 死鎖與饑餓
具有等待隊列的信號量的實現可能導致這樣的情況:兩個或多個進程無限地等待一個事件,而該事件只能由這些等待進程之一來產生。這里的事件是V操作的執行(即釋放資源)。當出現這樣的狀態時,這些進程稱為死鎖(Deadlocked)。
為了加以說明,考慮到一個系統由兩個進程P0和P1組成,每個進程都訪問兩個信號量S和Q,這兩個信號量的初值均為1。
```
P0 () {
While (1){
P(S) ;
P(Q);
// …
V(S) ;
V(Q) ;
}
}
```
```
p1() {
While(1){
P(Q);
P(S);
// …
V(Q);
V(S);
}
}
```
假設進程P0執行P(S),接著進程P1執行P(Q)。當進程P0執行P(Q)時,它必須等待直到進程P1執行V(Q)。類似地,當進程P1執行P(S),它必須等待直到進程P0執行V(S)。由于這兩個V操作都不能執行,那么進程P0和進程P1就死鎖了。
說一組進程處于死鎖狀態是指:組內的每個進程都等待一個事件,而該事件只可能由組內的另一個進程產生。這里所關心的主要是事件是資源的獲取和釋放。
與死鎖相關的另一個問題是無限期阻塞(Indefinite Blocking)或“饑餓” (Starvation),即進程在信號量內無窮等待的情況。
產生饑餓的主要原因是:在一個動態系統中,對于每類系統資源,操作系統需要確定一個分配策略,當多個進程同時申請某類資源時,由分配策略確定資源分配給進程的次序。有時資源分配策略可能是不公平的,即不能保證等待時間上界的存在。在這種情況下,即使系統沒有發生死鎖,某些進程也可能會長時間等待。當等待時間給進程推進和響應帶來明顯影響時,稱發生了進程“饑餓”,當“饑餓”到一定程度的進程所賦予的任務即使完成也不再具有實際意義時稱該進程被“餓死”。
例如,當有多個進程需要打印文件時,如果系統分配打印機的策略是最短文件優先,那么長文件的打印任務將由于短文件的源源不斷到來而被無限期推遲,導致最終的“饑餓”甚至“餓死”。
“饑餓”并不表示系統一定死鎖,但至少有一個進程的執行被無限期推遲。“饑餓”與死鎖的主要差別有:
進入“饑餓”狀態的進程可以只有一個,而由于循環等待條件而進入死鎖狀態的進程卻必須大于或等于兩個。
處于“饑餓”狀態的進程可以是一個就緒進程,如靜態優先權調度算法時的低優先權進程,而處于死鎖狀態的進程則必定是阻塞進程。
## 銀行家算法的工作原理
銀行家算法的主要思想是避免系統進入不安全狀態。在每次進行資源分配時,它首先檢查系統是否有足夠的資源滿足要求,如果有,則先進行分配,并對分配后的新狀態進行安全性檢查。如果新狀態安全,則正式分配上述資源,否則就拒絕分配上述資源。這樣,它保證系統始終處于安全狀態,從而避免死鎖現象的發生。
## 進程同步、互斥的區別和聯系
并發進程的執行會產生相互制約的關系:一種是進程之間競爭使用臨界資源,只能讓它們逐個使用,這種現象稱為互斥,是一種競爭關系;另一種是進程之間協同完成任務,在關鍵點上等待另一個進程發來的消息,以便協同一致,是一種協作關系。
## 作業和進程的關系
進程是系統資源的使用者,系統的資源大部分都是以進程為單位分配的。而用戶使用計算機是為了實現一串相關的任務,通常把用戶要求計算機完成的這一串任務稱為作業。
### 1) 批處理系統中作業與進程的關系(進程組織)
批處理系統中的可以通過磁記錄設備或卡片機向系統提交批作業,由系統的SPOOLing 輸入進程將作業放入磁盤的輸入井中,作為后備作業。作業調度程序(一般也作為獨立的進程運行)每當選擇一道后備作業運行時,首先為該作業創建一個進程(稱為該作業的根進程)。該進程將執行作業控制語言解釋程序解釋該作業的作業說明書。父進程在運行過程中可以動態地創建一個或多個子進程,執行說明書中的語句。例如,對一條編譯的語句,該進程可以創建一個子進程執行編譯程序對用戶源程序進行編譯。類似地,子進程也可以繼續創建子進程去完成指定的功能。因此,一個作業就動態地轉換成了一組運行實體——進程族。當父進程遇到作業說明書中的“撤出作業”的語句時,將該作業從運行狀態改變為完成狀態,將作業及相關結果送入磁盤上的輸出井。作業終止進程負責將輸出井中的作業利用打印機輸出,回收作業所占用的資源,刪除作業有關數據結構,刪除作業在磁盤輸出井中的信息,等等。作業終止進程撤除一道作業后,可向作業調度進程請求進行新的作業調度。至此,一道進入系統運行的作業全部結束。
### 2) 分時系統中作業與進程的關系
在分時系統中,作業的提交方法、組織形式均與批處理作業有很大差異。分時系統的用戶通過命令語言逐條地與系統應答式地輸入命令,提交作業步。每輸入一條(或一組)命令,便直接在系統內部對應一個(或若干個)進程。在系統啟動時,系統為每個終端設備建立一個進程(稱為終端進程),該進程執行命令解釋程序,命令解釋程序從終端設備讀入命令解釋執行用戶輸入的每一條命令。對于每一條終端命令,可以創建一個子進程去具體執行。若當前的終端命令是一條后臺命令,則可以和下一條終端命令并行處理。各子進程在運行過程中完全可以根據需要創建子孫進程。終端命令所對應的進程結束后,命令的功能也相應處理完畢。用戶本次上機完畢,用戶通過一條登出命令即結束上機過程。
分時系統的作業就是用戶的一次上機交互過程,可以認為終端進程的創建是一個交互作業的開始,登出命令運行結束代表用戶交互作業的終止。
命令解釋程序流程扮演著批處理系統中作業控制語言解釋程序的角色,只不過命令解釋程序是從用戶終端接收命令。
### 3) 交互地提交批作業
在同時支持交互和批處理的操作系統中,人們可以用交互的方式準備好批作業的有關程序、數據及作業控制說明書。比如,可用交互式系統提供的全屏幕編輯命令編輯好自編的一個天氣預報程序,用編譯及裝配命令將程序變成可執行文件,用調試命令進行程序調試。在調試成功后,用戶每天都要做如下工作:準備原始天氣數據,運行天氣預報執行文件處理原始數據,把結果打印出來等。這時,用交互系統提供的全屏幕編輯命令編輯好將要提交的作業控制說明書文件,如Windows系統的BAT文件和Linux系統的sh文件。然后用一條作業提交命令將作業提交給系統作業隊列中。系統有專門的作業調度進程負責從作業隊列中選擇作業,為被選取的作業創建一個父進程運行命令解釋程序,解釋執行作業控制說明書文件中的命令。
- 1. 操作系統概述
- 2.操作系統(計算機)進程和線程管理
- 2.1 進程的概念和特征
- 2.2 進程的狀態與轉換
- 2.3 進程控制
- 2.4 進程的組
- 2.5 進程的通信
- 2.6 線程的概念和多線程模型
- 2.7 處理機調度
- 2.8 操作系統典型調度算法
- 2.9 進程同步的基本概念
- 2.10 實現臨界區互斥的基本方法
- 2.11 信號量
- 2.12 管程:管程的定義、組成及基本特性
- 2.13 經典進程同步問題1
- 2.14 經典進程同步問題2:讀者-寫者問題
- 2.15經典進程同步問題3:哲學家進餐問題
- 2.16 經典進程同步問題4:吸煙者問題
- 2.17 死鎖的概念以及產生死鎖的原因
- 2.18 關于進程和線程的知識點匯總