---
title:
image:
description:
tags: Reading book, MOS
---
# Modern operating system
## 2 PROCESSES AND THREADS
現在 computer 同時會執行很多項目。過去使用 computer 的人們可能沒有完全意識到這一事實,因此,需要一些示例可能更清楚地說明這一點。
Web server:請求都是訪問 web page ,當請求進來,server 會檢查這個 page 是否在緩存中,有就回傳,沒有會發 disk request 抓資料。從 CPU 觀點,disk request 要花很久時間,當在等待 disk request 完成時,會有更多的 requests 進來。
:::info
If there are multiple disks present, some or all of the newer ones may be fired off to other disks long before the first request is satisfied. Clearly some way is needed to model and control this concurrency. Processes (and especially threads) can help here.
:::
user PC:系統開機過後,會有很多 user 看不到的 process 秘密的跑起來,舉例來說,會有一個 prcoess 等待收到的 email。或者是有一個 process 代表防毒程序,來定期檢查是否有新的病毒被定義出來。此外,當用戶在瀏覽 web 時,可能會有 process 同時在列印文件或是複製 user 的相片至 usb 裡面。所有這些活動都必須管理,並且支持 multiple processes 的 multiprogramming system 在這裡非常方便。
在 multiprogramming system 中,CPU 切換 process 到另一個 porcess 很快,大概只要 10~999 ms 即可以完成。嚴格來講,雖然CPU在任何時刻僅運行一個 process ,但在1秒鐘的過程中就可以執行許多 process,給人以並行的錯覺。
有些人會在這種情況下說是 pseudo parallelism ,並跟真正硬體上 parallelism 的 multiprocessor systems (具有兩個或多個 CPU 共享同一物理內存的真實硬件並行)進行比較。
人們很難進行多個並行活動的追踪。 因此,這些年來,操作系統設計者已經發展了一種概念模型(sequential processes),該模型使並行性更易於處理。 該模型,其用途及其某些後果構成了本章的主題。
### 2.1.1 The Process Model
在此模型中,computer 上的所有可運行的軟件(有時包括作業系統)都組織為多個 sequential processes ,或簡稱為多個 processes 。process 只是執行中的 program,包括程序計數器,站站存器和變量的當前值。從概念來說給每一個 process 都會認為自己佔有 CPU。實際上 CPU 會在多個 process 來回的切換,為了更容易了解系統,我們會以 pseudo parallel 來理解這樣的模式,相較於往死裡追蹤 CPU 來回切換的 program 路徑的說法會更容易一些,而這樣的模式就是第一章所提到的 multiprogramming。
<img src="https://i.imgur.com/IRnUJAL.jpg"></img>
在圖2-1(a)中,我們看到 computer 對 memory 中的四個 program 進行 multiprogramming 處理,在圖2-1(b)可以看到四個 process 有各自的 control flow (自己的 program counter(PC)) ,並且每個 process 相對於其他 process 都是獨立運行的,而實體 PC 只有一個,所以每當要切換到其他 porcess 執行時,需要將當前的 PC 值存入 CPU 要踢出的 process 所屬的 memory 區塊中,之後 CPU 要將實體的 PC 值更新成之後要執行的 porocess PC 。(context switch)在圖2-1(c)可以看到在一段時間內所有的 process 都有所進展,但是在某一個瞬間,只有一個 process 在執行。
本章為了方便說明做了一些基礎假設,CPU 只有一顆,這假設可能不太好,因為現代晶片大多為 Multicore,並且現代 computer 大多都為 Multiporcessor (多晶片),Chapter 8 會說明。如果有兩個 core 護或是 CPUs ,則可以在同一時間執行兩個不同 process。
隨著 CPU 在不同的 process 來回切換,如果再次執行相同的 process,則 process 執行其計算的速率將不一致,甚至可能無法重現。因此,不應該使用時序的假設來對 process 進行編程。例如,有一個 audio process ,該 process 在播放音樂的過程會伴隨著另一台設備播放的高畫質影片。因為 audio 應該會比 video 晚播放些,因此會先通知 video server 開始播放,然後在播放 audio 之前先 idle loop 10000 次,這個 loop 是可靠的計時器,但是如果 CPU 決定在 loop 期間切換至其他 process ,這可能導致 video 已經跑到相應位置而 audio 切不回來,導致 video 與 audio 不同步。
當有一個 process 為即時請求(在一定時間內一定要完成請求),則上述情況就有可能發生。但是通常大多數 process 不會受到 CPU underlying multiprogramming 或是不同 process 的相對速度的影響。
:::info
Normally, however, most processes are not affected by the underlying multiprogram- ming of the CPU or the relative speeds of different processes.
:::
Program 跟 Process 差異極小,了解這個差異極為重要。以下為例
假設今天你要做蛋糕給你女兒吃,你會有蛋糕配方跟材料(麵粉、蛋、糖、香草精),而蛋糕配方就是 Program,你就是 CPU,而材料就是 input data,而按照配方做蛋糕的一連串動作(閱讀配方 -> 放入材料 -> 攪拌 -> ... -> ...)就是 Process 。突然間你兒子跑進來說被蜜蜂叮到,因為你兒子目前情況比較重要所以你必須先放下手邊的工作(做蛋糕),所以你紀錄了目前做蛋糕做到一半的動作(存 programing conter),去拿 first aid book (program),並按照書上的指示來救你兒子。而救完你兒子,你可以繼續做蛋糕或是去做另一件事情(看看為什麼你兒子被蜜蜂叮到)。這裡可以看到你從一個動作切換到另一個動作,這意味著 CPU(你)從一個普通的 process(baking) 切換到 real-time process(administering medical care)。
process 的關鍵思想是某件事情的動作。會有 program、input、output、output。一個處理器可能會有多個 process 共用,會有一個排程演算法在一個時機點或是某條件下會從 process 切到另一個 process 。當然也會有某些 program 沒被用到,一直被放置在儲存裝置裡(Disk、SSD、non-volatile memory),像是你很久沒開的遊戲。
值得注意的是同一個 Program 跑兩次會被視為兩個 Process 。舉例來說,如果今天你有兩台印表機同時可以用,你可以同時使用它們來做列印,此時就會有兩個不同的 Process 產生,即使他們是運用同一份 code ( operating system 可能能夠在它們之間共享 code ,因此 memory 中只有一個 copy)在運行。
### 2.1.2 Process Creation