# Operating System Ch 3 - Processes Concept [清大周志遠老師的課程錄影](https://www.youtube.com/playlist?list=PLS0SUwlYe8cxj8FCPRoPHAehIiN9Vo6VZ)的筆記。 contributed by <[`kaeteyaruyo`](https://github.com/kaeteyaruyo)> ## Process 的概念 * **Process 就是正在執行的 Program** (翻成中文反而好誤導建議大家直接記英文) * Process 在記憶體裡面的的組成物 * Text section (code segement) * Data section * (Static section)(不知為何沒講) * Heap * Stack * Program counter 和暫存器內容等(被 switch 掉的時候要暫時放進記憶體) * 相關的資源(例如已經開啟的檔案的 handler 之類的)  * **Thread** 就是輕量化的 Process * 每一個 Process 可以創造出一到多個 Thread 來幫他做事情,這些 Thread 可能會共享部份記憶體(例如: code section, data section, OS resource),但是會有自己的 program counter 和暫存器內容等 * Thread 是作業系統當中使用 CPU 的最小單位實體 * 有些作業系統不區分 Process 和 Thread  ### Process State  * 一個 Process 的生命週期中會有以下五個狀態 * **New**: 一個 program 準備要被放進記憶體裡面變成 process 時的狀態(早期電腦記憶體寸土寸金的時候不是說 program 想執行就可以執行的) * **Ready**: process 已經進了記憶體但是還在排隊等著用 CPU 時的狀態 * **Running**: process 正在使用 CPU 時的狀態 * **Waiting**: process 正在做 I/O / 被 swap out / 正在做一件很花時間的事情沒有要用 CPU 時的狀態 * **Terminated**: process 事情做完了要善後(釋放資源)時的狀態 * **Process Control Block (PCB)** * 來記錄每一個 process 的控制資料(metadata),以一個 linked list 的結構儲存在 OS 的記憶體當中 * 當 process 要從 create 變成 ready,意思就是創建一個這樣的 PCB  * **Context switch** * 在分時系統當中,process 每隔一段時間就要讓出 CPU 執行權。當 P0 要讓出執行權給 P1 時,P0 要先把他在 CPU 暫存器中的資料存進自己的 PCB,然後 P1 也要把他在 PCB 當中的資訊載入 CPU 暫存器,中間這段搬運資訊的工作就叫做 context switch * Context switch 是 OS 在工作,P0 和 P1都沒有在做他們想做的事,**所以算是一種 overhead**  ## Process 排程  * Process 有很多種原因會被 context switch 掉,被 switch 掉時會回到某個 queue 裡面,只要有 queue 就會有**排程 (scheduling)**(決定隊伍裡的人誰排前面誰排後面)的問題 * Scheduler 有三種 * **Short-term scheduler (CPU scheduler)**: 決定有哪些 process 可以從 ready state 進入 running state,因為這件事很常發生所以必須很快 * **Long-term scheduler (Job scheduler)**: 在以前記憶體不夠多的年代,決定有哪些 program 可以從 create state 進入 ready state,近年來記憶體變大了所以這個功能已經逐漸淘汰 * **Mid-term scheduler**: 因為現代記憶體都很大,而且還有虛擬記憶體技術,所以一般來說有 process 要 create 時都會先進記憶體。此時如果記憶體不夠用或 CPU/IO 的時間比不夠平衡,就要決定哪些 process 要先 swap in/out 虛擬記憶體中(從 ready 到 waiting) * 排程的目標 * 因為同一個程式一定要嘛是在做 CPU 計算要嘛是在做 IO,Multi process 的作業系統為了確保 CPU 跟 IO 裝置都全力在工作,所以 Long-term / Mid-term scheduler 的目標會是把 process 安排成花費 CPU 時間和花費 IO 時間差不多的比例 * 而負責決定誰有 CPU 可以用的 Short-term scheduler 則是針對不同目的有不同的演算法,例如:最小化平均等待時間、最小化回應時間、確保每個 process 都能公平取得 CPU 時間等等 ## Processes 相關操作 (以下內容以類 Unix 系統為例) * 在 Unix ==(其他系統好像也是)== 裡面,**所有的 process 之間都是有父子關係的**,開機時的那一個 [init process](https://zh.wikipedia.org/zh-tw/Init) 會負責創造出其餘的 process * 我們可以用 `htop` 之類的工具看到這些 process 之間的關聯性 * 或是執行 `ps -ael` 指令,然後根據 parent process ID 重建這個樹狀關係 * 三個跟創造 process 有關的系統呼叫 * **`fork()`**: 當一個 process 呼叫了 `fork()`,他會創造出一個跟他一模一樣的另一支子程式出來。`fork()` 會回傳不同的值給創造程式的那支程式(父親)和他創造出來的那支程式(小孩),父親會得到小孩的 PID,小孩的 PID 是 0,所以可以根據這個值決定接下來兩個人分別要做什麼 * 要注意的點是:在 Unix 系統中程式被 `fork()` 出來,**他的 memory 和 register 的狀態是和 parent 一模一樣的** * **`execlp()`**: 通常我們創造出一個新的 process 是希望他去做跟父親不一樣的事,所以我們可以使用 [exec 系列的 system call](https://burweisnote.blogspot.com/2017/08/execlpexecvp.html) 來抽換小孩的記憶體內容(包含程式碼區塊和變數資料),讓他變成另一個完全不同的程式 * **`wait()`**: 由於在 unix 系統中父親和小孩是 concurrent(並行執行,也就是不保證誰先執行誰後執行)的,所以如果希望確保一定要小孩先把事情做完再輪到父親收尾(例如清除記憶體內容等)的話,父親需要呼叫 `wait()` system call,強制自己進入 waiting queue * ([jserv 有寫文章講解這個東西](https://hackmd.io/@sysprog/unix-fork-exec))  * 要把 process 結束掉有以下三個指令 * **`exit()`**: 當一個 process 執行了這個系統呼叫,就會去釋放**自己**持有的記憶體和相關資源 * **`abort()`**: 一個 process 可以執行這個系統呼叫去殺掉**他創造出來的 process** ==(不知道可不可以殺更深層的子代)== * **`kill()`**: 任何擁有 root 權限的人都可以執行這個系統呼叫去殺掉**任何指定的程式**(透過 PID) ## 行程間通訊 (Interprocess Communication, IPC) * **Interprocess Communication (IPC)**: 多個 process 或是 thread 之間互相溝通的方法。依照記憶體的使用方式,可以分成兩大類 * Message passing * Shared memory ### Message Passing * Message passing 一定會有 **`send()`** 和 **`receive()`** 這兩個函式,可以根據傳輸雙方的中間有沒有一個中介者分為 direct / indirect communication,如果是前者那一定是同步化的(或是叫 blocking);後者的話可以是同步化也可能是非同步化,如果非同步化就也要處理同一個訊息要怎麼指定被某一個 reciever 收到的問題 * (剩下的我賭不會考所以省略) ### Shared Memory * Shared memory 雖然比 message passing 更快,但是會有 **concurrency** 的問題,也就是當兩個 process 同時都要去讀寫同一塊記憶體空間時,由於我們無法確保哪一個 process 會先動作,所以可能會得到預料之外的操作結果。為了解決這個問題,我們需要有**同步化 (synchronization)** 的機制。最著名的例子就是生產者與消費者問題 ### 遠端電腦通訊 * Socket * 網路系統中的兩台不同主機之間傳遞訊息的作法,透過 IP 和 port 來分辨不同的程式,傳遞的東西是單純的 byte string,process有義務自己把他們轉成特定資料格式或型態 * Remote procedure call (RPC) * 把 OS 提供的 system call 包成一個 user space 的 API,讓 process 可以直接像是在呼叫一個普通的函式一樣去執行遠端電腦的程式碼 * RPC 和 socket 的差別只在 RPC 的 function 是有 data type 的 ---- [<< Ch 2 - OS Structure](https://hackmd.io/@kaeteyaruyo/operating-system-2) | [目錄](https://hackmd.io/@kaeteyaruyo/operating-system-index) | [Ch 8 - >>](https://hackmd.io/@kaeteyaruyo/operating-system-8)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.