行程與執行緒的差異:比較記憶體、切換與使用時機
行程是擁有專屬位址空間與資源、正在執行的程式。執行緒是行程中的執行單位。同一個行程的執行緒共用記憶體,因此建立成本小、通訊也快,但一個錯誤或異常終止會影響整個行程。不同的行程彼此隔離,較為安全,但建立的成本以及行程間通訊的成本都比較大。
| 項目 | 行程 | 執行緒 |
|---|---|---|
| 是什麼 | 擁有專屬位址空間與檔案等資源、正在執行的程式 | 行程中的執行流程。擁有自己的堆疊與暫存器 |
| 記憶體 | 各自獨立的虛擬位址空間。與其他行程隔離 | 共用行程的程式碼、堆積與全域資料。專屬的只有堆疊 |
| 建立成本 | 重。必須準備新的位址空間(可利用寫入時複製來降低成本) | 輕。不需要新的位址空間 |
| 情境切換 | 高。位址空間會改變,位址轉換結果的快取(TLB)可能失效 | 便宜。位址空間與快取維持不變 |
| 通訊 | 需要管線、通訊端、共用記憶體等行程間通訊 | 可直接讀寫共用記憶體,速度快 |
| 隔離與故障 | 異常終止多半只限於該行程之內 | 一個執行緒的異常終止,可能牽連整個行程 |
| 同步 | 在行程之間共用記憶體或檔案時需要 | 共用資料時一律需要。若沒有互斥鎖或不可分割操作,就會發生資料競爭或死結 |
| 排程 | 包含一個以上的執行緒 | 由作業系統實際分配給CPU核心的單位 |
| 主要用途 | 為了隔離與安全。瀏覽器的分頁、服務、Shell的管線 | 單一程式內的平行處理。處理大量連線的伺服器、背景處理、平行運算 |
數值為具代表性的大致參考值,會因世代或產品而異。