Thread and Process
Program (程式)
Program 意旨軟體工程師在 IDE、editor 等所寫的程式碼(code),也就是說還尚未 load 入記憶體的 code,我們稱之為 Program。
• 相同 Program 所建立的 Process 可以多個同時存在。
Process (行程,亦可稱作處理程序、進程)
Process 是正在執行中的 Program 實例,點開應用程式就是讓 OS 從硬碟中載入到 Memory 中,分配必要的系統資源,建立一個 Process 來執行它。
以下條列幾點 Process 的觀念
- Process 是電腦中已執行 Program 的 Instance。
- 每一個 Process 是互相獨立的。
- Process 本身不是基本執行單位,而是 Thread 的資源管理和執行環境。
- Process 需要一些資源才能完成工作,如 CPU、記憶體、檔案以及 I/O 裝置。
- 在多功作業系統(Multitasking Operating System)中,可以同時執行數個 Process ,然而一個 CPU 一次只能執行一個 Process,而 Process 的運行量總量不會少於 CPU 的總量,又Process 會佔用記憶體,因此如何排程(Scheduling,恐龍本第五章) 、如何有效管理記憶體(恐龍本第八章)則是 OS 所關注的事。
Process 本身包含的部分有 Text Section、PC(program counter)、暫存器內容、Stack、Data Section 以及 Heap
其中:
text section:存放程式碼本身
Stack:
- 暫存資料
- Function Parameters、return addresses、local variable
Data Section:存放 global variable
Heap:Process 進行過程所 dynamically allocated 的 memory space
Thread (執行緒、線程 )
前面有提到 Process 是 Thread 的資源管理和執行環境,在同一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能。以聊天室 Process 為例,可以同時接受對方傳來的訊息以及發送自己的訊息給對方,就是同個 Process 中不同 Thread 的功勞。連結 Process 的想像,Thread 就是工廠內的工人,確保工廠的每項功能,並且共享工廠內的每一項資源。
以下條列幾點 Thread 的觀念
- 同一個 Process 會同時存在多個 Thread。
- 同一個 Process 底下的 Thread 共享資源,如 記憶體、變數等,不同的 Process 則否。
- 在多執行緒中(Multithreading),兩個執行緒若同時存取或改變全域變數(Global Variable),則可能發生同步(Synchronization,恐龍本第六章)問題。若執行緒之間互搶資源,則可能產生死結(Deadlock,恐龍本第七章),同樣的,如何避免或預防上述兩種情況的發生,依然是 OS 所關注並改善的。
Thread 的使用上,作業系統(OS)會根據 Thread 的優先權及已使用的 CPU 時間,在不同 Thread 間進行切換,確保各 Thread 都有執行機會。
父 Process 可新增多個子 Process,形成樹狀結構。系統透過 process identifier(pid)來辨識與管理 Process。
父、子 Process 間的資源分配方式有三種:
- 父、子 Process 間共享資源。
- 子 Process 共享父 Process 的部分資源。
- 父、子 Process 間不共享資源。
行程控制區塊(Process Control Block,PCB)
PCB裡內含 Process 的基本資料,以及連結著每一個 Process,所以也稱作為「任務控制區塊(task control block)」。
- 行程狀態(Process state):running、waiting等。
- 行程計數器(Process counter):表示下個指令位置在哪裡。
- CPU暫存器(CPU registers):當行程被插斷後,儲存在CPU暫存器的內容。
- CPU排程(CPU scheduling):選擇優先順序的行程。
- 記憶體(Memory):管理分配給行程的記憶體資料、打開了那些檔案。
- 紀錄(Accounting):紀錄CPU使用狀態、時間等。
- I/O狀態敘述(I/O status information):打開文件列表,將I/O裝置分配給行程。
