Java 面試 - Program、Process 和 Thread
請簡介 Program、Process 和 Thread 及其差別
這一題倒是比較少考到,不過為了後面講解多執行緒 (Multi-Thread) 以及 JVM Stack/Heap 方便,所以還是必須要提一下。
聲明:
這些內容比較簡略、粗糙,忽略了很多細節,只揀選能回答到問題的部份去解說,並不是百分之百準確,除非每一題都有兩個小時以上的回答時間,否則這些內容應該足夠回答到面試官想聽的點。如果你真的很在乎每一個部份的細節內容,你不該讀我的筆記,而是去讀文件,自己寫自己的筆記。當然,我會隨著越講越深入而帶入更多細節的部份,但是我也需要考量文章篇幅以及流暢度。
若有任何錯誤或遺漏之處,請在底下用力鞭我,不用客氣,隱瞞缺失比直指痛處更讓人害怕。
Program 程式
還沒有被執行的程式,或是說可以驅動 / 命令電腦的指令集合,它可能是指令、可讀的程式碼、編譯過的位元碼 (bytecode) 或是機器碼。
Process 程序
當 Program 被執行時,所產生的執行個體,Program 被執行就會產生 Process,所以如果同時執行同一個 Program 十次,就會產生至少十個 Process。要切記一點,一顆 CPU 同時只能做一個運算,多工作業系統 (Multitasking Operating System) 可以同時運行多個 Process 是因為它將 Process 進行排程 (Scheduling),令 CPU 在各 Process 切換,因為速度很快,所以才會有同時處裡好多個 Process 的錯覺。
Process 粗略包含以下兩個部分 (實際上更複雜,未來再討論) :
Memory Space 記憶體空間
所有此 Process 的共享資料、資源放置於此,同一個 Process 底下的所有 Thread 皆可存取,但是不同 Process 的 Memory Space 不同,Process 彼此之間無法存取對方的 Memory Space。
Thread 執行緒
Thread 執行緒
CPU 實際運算的部分,Thread 包含兩個部分 (實際上更複雜,未來再討論) :
Stack 堆疊
儲存從起點開始 (例如main
),到目前為止所有函數呼叫路徑,以及這些呼叫路徑上所用到的區域變數。
CPU 狀態
存放 CPU 暫存器 (如 Program Counter, Stack Pointer, Program Status Word…) 等狀態,以便在 CPU 再次回來執行時能知道上次執行狀況。
–
一個 Process 包含一個以上的 Thread,以 Java SE 為例,應用程式從起始的入口 main
開始執行,這就是主執行緒 (Main Thread),如果程式內沒有創建其他 Thread,則稱為單一執行緒;若是程式內有使用類似以下方式去主動創建 Thread,則稱為多執行緒 (Multithreading)。
1 | public class ThreadExample1 extends Thread { |
1 | public class ThreadExample2 implements Runnable { |
前面說到 CPU 會在 Process 之間做切換,其實 CPU 被分配給 Process 時主要是執行 Thread 運算,當 CPU 要處理的 Process 底下有多個 Thread,CPU 會依照 Thread 優先順序以及 CPU 使用時間去分配,在 Thread 之間做切換,讓每個 Thread 都有被執行到的機會,達到多個 Thread 同時運算的效果。
總結
- Program 是還沒被執行的指令或程式集合
- Process 是 Program 執行時產生的執行個體
- Process 下有 Memory Space 和一個以上的 Thread
- Memory Space 是同 Process 下所有 Thread 共用,主要用來存放共享的資料及資源
- Thread 有自己的 Stack 來儲存函數路徑及區域變數,所以不同 Thread 之間的區域變數是互相獨立的
- CPU 會在 Process 之間快速切換來達到多工的目的
- CPU 也會根據 Thread 優先權以及 CPU 使用時間,在 Thread 之間切換,讓每個 Thread 都有被執行的機會