---
# System prepended metadata

title: Process
tags: [OS Note Pro]

---

# Process
###### tags: `OS Note Pro`
在早期，CPU一次只能執行一個process，整個資源都被它占用，但今日已經發展出了multiprograming的技術，而要支援這樣的技術靠的就是**Process**。

[TOC]

## Process concept
在定義Process之前，我們必須先分清楚**Process**與**Program**的差別。

<font color="blue">Program:</font>是指存在Disk的程式碼(binary)，"被動的"等待被call去memory裡被執行。
<font color="blue">Process:</font>是指在memory中執行的程式(memory中正在被執行program)，CPU"主動的"調用並執行。

<font color="black orange">Process's component:</font>
- Data section : 存global variable
- Code section : 指令所在處
- Stack : 存local variable
- Heap : 動態變數，ex: malloc
- Activity information : 一些流程資訊，如 : program counter等
- Resource : 這裡說是file handler(處理程序)，但不是很明確知道他的意思

了解了它的定義後，因為要知道她是如何在系統中運作，所以我們必須知道它的**狀態**，這能讓我們知道這個Process該在甚麼時候做甚麼。

<font color="black orange">State of process:</font>
- new : ~~在disk的狀態，還沒被指派成process~~ The process is being created(Process正在被創建)
- Ready : 在memory的狀態，隨時可以被scheduler派遣到CPU
- Run : 在CPU中執行
- Wait : 被I/O 或 event發生而停下來等待(等待事件發生)，好了後回到Ready
- Terminate : 執行完畢或終止

### Process control block(PCB)
知道了process的狀態後，接下來就要了解該怎麼協調process的運作啦。

而管理這些process的就是靠在kernel中的這麼一個**資料結構 : PCB**，它記錄了process的各種資訊，以至於在CPU中要處理這些process只要透過這個table就能知道它的各種資訊了。每一個process都有各自的PCB，而PCBs的set稱為"Process table"。

<font color="black orange">PCB's content:</font>
- Process state
- Process number : 該process的PID
- Program counter : 每個process都有code section，這時當然需要program counter才能知道下一個instruction要執行哪行
- PCB pointer : 指到下一個link的PCB
- <font color="blue">CPU scheduling informaion(priority)</font>
- <font color="blue">Memory management information</font> . . .(base/limit memory)
- <font color="blue">Register</font>
- <font color="blue">I/O ~~dive management~~ state information</font>

### Context Switch
<font color="blue">Definition: Kernel saves the old state of process and loads the saved state for new process.</font>
為了達到**multiprograming**以及**Time sharing**，我們需要在process間不斷的切換，所以PCB就扮演了很重要的角色啦。
:::info
執行過程: 當有一個process執行到一半被interrupt，CPU要先去執行其他process時，會先將原來的process state存在該PCB(a)中，接著去reload要被執行的PCB(b)的state，執行完要回來就save PCB(b)的state，然後同樣的reload PCB(a)繼續執行. . .
:::

## Process Scheduling
接著就是OS的一個很重要的工作---排程。

要做scheduling 的原因有2:
1. Multiprograming : CPU的使用率要高。
2. Time sharing : 使程式能與user互動，必須不斷做context seitch。

### Long-term scheduler
將Disk的program搬到memory，決定multiprograming的程度，通常Long-term的速度是較慢的，因為Program的數量是人給了才有，且得依照memory量大小決定能不能搬。
:::info
Scheduling的目的都是希望能夠讓CPU的使用效率越高越好，所以Long-term對於I/O和純計算的program數量間的協調必須要做好，不能指偏向一個不然就會沒用到、浪費或Idel在那了。
<font color="red">Select a good mix of CPU bound and I/O bound process </font>
:::
:::warning
I/O的發生應該都從Disk來吧? 一些device有些要求寫成封包等待被拿進memory被CPU執行吧。 . . . 待求證
:::
### Mid-term scheduler
在memory與disk間做job的swap，動態協調CPU要執行的job，進一步增加CPU執行效率。
:::success
現在很多OS都沒有用Long-term了，因為virtual memory的出現能夠加速memory與disk的傳輸，所以Mid-term取代了Long-term，使用者的program也能夠直接存在所謂的virtual memory。
:::
### short-term scheduler
決定memory要交給CPU執行的job，這個挑選job的執行時間必須很快，因為CPU的運算可是分秒必爭的阿。

## Operation Process
這裡主要是來介紹一些process的基本功能如:**fork()、excelp()、wait()等**，以及這些操作帶來的現象。

### fork() and child process
在不同的系統，fork()帶來的結果皆有不同
1. child 與 parent 的 resource sharing
    - 完全複製parent
    - 只複製一些
    - 完全沒複製
2. 執行狀態
    - 兩個同時執行、不知道誰先誰後完成
    - parent等child完成才執行
3. ** [address space](https://en.wikipedia.org/wiki/Address_space) (指一些變數或資料的address?)
    - 完全複製parent的程序，溝通透過shared memory
    - 有新的程序給child，溝通透過message passing
:::warning
第3點的溝通指的是與parent溝通嗎? 還有address space到底泛指哪個部份呢?
:::
### excelp()、wait()
excelp()會將child的原程式全部替換成新的要執行的程式(毀掉舊的code)，但該process仍為parent的child，所以仍舊wait()的到它。

### Process terminate()
Terminate 有3種狀況 : **執行完成、exit()、abort(pid)**。
- <font color="blue">exit() : 會將原process的resourse(file handler、open file、allocate memory等) deallocate。</font>
- <font color="blue">abort() 原因有2 : 這個process超出了allocate給他的memory範圍; 這個Task已經不需要了</font>

## Interprocess Communication
<font color="black orange">**IPC** : IPC指的是在一個或多個process之間透過multiple threads傳遞data做溝通的一些方法。</font>

### Shared memory
~~前一章有提過。~~
有一個記憶體區塊是用來當shared memory使用。
process之間只要透過這區塊的address就可以溝通。
<font color="blue">Feature:</font>
1. Faster
3. But, 不能同時寫入，否則會dead lock。

<font color="black orange">要用shared memory來溝通的process必須要告知OS來移除constraints of access memory，不然kernel會擋。</font>
### <font color="black orange">Message passing</font>
透過send和receive的方式來溝通。

對於hardware的link 可以是 : <font></font>
而logical property 有:
1. Direct or Indirect communication
2. Symmentric or Asymmentric communication
3. Blocking or Nonblocking
4. . . .
#### Direct vs Indirect
<font color="blue">Direct:</font>
one-to-one的架構，必須要能夠辨別彼此，一個傳，另一邊馬上就收。
<font color="black orange">Processes之間要明確得為對方命名</font>
<font color="black orange">有單向的架構，但通常是雙向的。</font>
<font color="blue">Indirect:</font>
many-to-many，像一個mail box，而這個mail box由kernel管理。兩邊都到mail box寄和取，不需要知道彼此，但也衍生出Blocking or nonblocking的問題。
<font color="black orange">mail box要自己獨特的ID，process之間要shared同一個mail box才能溝通。</font>
<font color="black orange">有單向的架構，但通常是雙向的。</font>
#### Blocking vs nonBlocking
又各自分為send和recive的blocking和nonblocking。

<font color="black orange">依據blocking or non，buffer可分為:
1. Zero buffer: Sender and receiver都是blocking
2. Bounded buffer:Sender 是blocking的，滿了就會被block。
3. Non bounded buffer: Nonblocking的Sender，有messege傳就對了</font>

### Socket port
傳binary的封包。
IP:
Port:
### Remote process communication(RPC)
Def: Call another process's procedure(function) rather then stream of bytes.
<font color="black orange">讓process能夠過network system來procedure call 其他電腦或process</font>
機制是透過 : **stub**
<font color="black orange">Client stub:</font>
1. 將parameter包裝進messege
2. 透過OS傳給server
3. 等待return

<font color="black orange">Server stub:</font>
1. 收到Client的package
2. Unpackage得到parameter
3. 到自己的系統找相對應的procedure
4. 運算完return回傳值
