# 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
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up