---
# System prepended metadata

title: Process 調度(Process Scheduling)

---


可以使用queue的概念來解釋。想像一個排隊的場景，不同的process就像是排隊等待服務的人，而CPU則是提供服務的服務窗口

* Multiprogramming：CPU 始終運行process以最大化 CPU 利用率

* Time sharing：頻繁切換CPU，以便用戶可以在每個程序運行時與其進行交互
* process必須等到 CPU 空閒並且可以重新調度

![](https://hackmd.io/_uploads/rybRFiJYh.png)

## Process Scheduling Queues
* Job queue（新狀態）-系統中所有process的集合
* Ready queue（就緒狀態） - 駐留在主內存中的所有process的集合，準備好並等待執行

* Device queue（等待狀態）- 等待 I/O 設備的process集

![](https://hackmd.io/_uploads/HkwI9o1K3.png)

## Schedulers
* Short-term scheduler（CPU scheduler）-選擇應執行哪個process並分配CPU（Ready state → Run state）

* Long-term scheduler（job scheduler）——選擇哪些process應加載到memory中並放入就緒queue(New state→ Ready state)
* Medium-term scheduler - 選擇哪些process應換入/換出memory（Ready state→→ Wait state）

![](https://hackmd.io/_uploads/Hyf55jytn.png)

## process 樹
* process樹的形狀和結構取決於process的創建和終止操作。
* 作業系統通常提供相關的系統調用和命令來查看和管理process樹的結構。
* 每個process都由唯一的處理器標識符(pid) 標識

root process： process樹的root節點是操作系統創建的首個 process，稱為root process。root process是所有其他 process的祖先。

父子關係：在 process樹中，每個 process可以擁有一個父 process和多個子 process。父 process創建子 process，子 process是父 process的衍生。子 process可以再創建自己的子 process，形成多個層次的層次結構。

階層關係： process樹展現了 process之間的階層關係。每個 process（除了根 process）都有唯一的父 process，並且可以有多個子 process。這種結構使得 process之間可以形成層次結構，方便管理和組織。

狀態傳遞：在 process樹中， process的狀態可以在父子 process之間傳遞。例如，當父 process終止時，它的子 process也會被系統接管或終止

![](https://hackmd.io/_uploads/Bk5PcTyKh.png)
UNIX：“ps -ael”將列出所有活動process的完整信息

## Long-term scheduler
* 多道程序控製程度
* 執行頻率較低（例如，僅在process離開系統時調用或幾分鐘調用一次）
* 選擇CPU密集型和I/O密集型process的良好組合以提高系統整體性能
* UNIX/NT：沒有Long-term scheduler
    * 創建的process放置在Memory中供Short-term scheduler程序使用
        * 多道程序設計程度受到硬體限制（例如終端數量）或用戶自我調整性質的限制

## Short-term scheduler
非常頻繁地執行（例如每 100 毫秒執行一次）
必須高效：
* 如果選擇一個工作需要 10 毫秒，那麼這樣的選擇需要 100 毫秒，
    * → 管理費用 = 10/110 = 9%

![](https://hackmd.io/_uploads/B16uvn1th.png)

## Medium-Term Scheduler
換出：從memory中刪除process以減少多道程序設計的程度
換入：將換出process重新引入memory
目的：改善process組合，釋放memory

![](https://hackmd.io/_uploads/HyqSFhkFh.png)

## Process Creation
* 資源共享
    
    * 父子process共享所有資源
    * 子process共享父process的資源子集
    * 父母和孩子不共享資源

* 執行的兩種可能性
    * 父級和子級同時執行
    * 父process等待子process終止
* 地址空間的兩種可能性
    * 父級的子級副本，通過共享變量進行通信
    * 子process中加載了一個程序，通過消息傳遞進行通信

## UNIX/Linux process創建
* fork系統調用
    * 創建一個新的（子）流程
    * 新process複製其父process的地址空間
    * 子process和父process在 fork 後同時執行
    * Child：fork的返回值為0
    * Parent：fork的返回值為子process的PID
* execlp 系統調用
    * 將新的二進製文件加載到內存中 - 銷毀舊代碼
    * 等待系統調用
    * 父process等待其子process之一完成

![](https://hackmd.io/_uploads/S1nZMTyFh.png)


![Uploading file..._ii20x7ef7]()
