並行不是你所想的那樣

您是否想過,為何只有一顆CPU的電腦,卻能同時執行數千個程式?這一切都歸功於「並行」(Concurrency) 技術,它創造了一種強大的「同時執行」的假象。

單核心CPU的多工處理模擬

觀察CPU如何在不同程式間快速切換,快到讓您以為它們是同時進行的。

CPU 核心
程式 A
程式 B
程式 C
當前執行:
準備開始...

問題的根源:昂貴的閒置時間

在個人電腦普及前,大型主機 (Mainframe) 極其昂貴。然而,在執行一個程式的過程中,有大量的準備時間,例如從磁帶載入編譯器或等待使用者輸入,這段期間CPU完全處於閒置狀態,造成巨大的資源浪費。

早期電腦執行程式的繁瑣流程

載入編譯器
➡️
CPU 閒置
➡️
編譯成組合語言
➡️
載入組譯器
➡️
CPU 閒置
➡️
組譯成機器碼
➡️
執行程式

將滑鼠懸停在步驟上查看說明

解決方案:作業系統的巧妙調度

為了解決CPU閒置問題,分時 (Time-sharing) 作業系統誕生了。作業系統扮演著交通警察的角色,透過精準控制CPU中的「位址暫存器」,讓CPU在不同程式之間來回跳轉執行,這就是所謂的「情境切換」(Context Switching)。

CPU排程模擬器

CPU內部有一個「位址暫存器」,指向下一個要執行的指令記憶體位址。作業系統的「排程器」透過改變這個暫存器的值,來決定下一個要執行哪個程式。

位址暫存器: 0x0000
目前執行:

作業系統如何奪回控制權?

程式不能無限制地執行,必須在某些時刻將控制權交還給作業系統。這是透過「中斷」(Interruptions) 機制實現的。

當程式需要執行敏感操作,如讀取檔案或請求記憶體時(稱為I/O操作),它會觸發一個中斷信號。CPU收到信號後,會暫停目前工作,儲存當前狀態,然後跳到作業系統的專屬記憶體區域執行「中斷服務常式」。

此時,作業系統便重新掌握了CPU的控制權,它可以處理程式的請求,並決定接下來要執行哪個程式。這個循環不斷重複,構成了多工處理的基礎。

技術的演進:從合作到強制

早期的排程方式依賴程式「自願」交還CPU,但如果遇到惡意或有bug的程式(例如無限迴圈),系統就會完全卡死。為了安全與穩定,現代作業系統採用了更強制的手段。

協同式排程

Cooperative Scheduling

🤝
控制權:程式主導,自願放棄。
⚠️
安全性:低,易被單一程式綁架。
💻
代表:早期 Windows (3.1及以前)。

先佔式排程

Preemptive Scheduling

👑
控制權:系統主導,強制收回。
🛡️
安全性:高,穩定且公平。
🚀
代表:現代作業系統 (Windows 95+, Linux)。

現代應用:並行 (Concurrency) vs 平行 (Parallelism)

隨著多核心CPU的出現,我們終於可以實現真正的「平行處理」。但這不代表並行就過時了,事實上,兩者在現代電腦中協同工作,以最高效率管理無數的任務。

多核心處理模型

在多核心系統中,排程器可以將不同程式分配到不同核心上,實現真正的同時執行。

核心 1
閒置
核心 2
閒置

並行 (Concurrency)

是關於「處理」很多事情。它是一種結構,一種管理多個任務的方式,即使只有一個執行單元,也能透過快速切換來推進所有任務。

平行 (Parallelism)

是關於「執行」很多事情。它需要多個執行單元(如多核心),讓多個任務在物理上真正同時發生。

"Concurrency is about dealing with lots of things at once.
Parallelism is about doing lots of things at once."

並行是關於一次處理很多事,而平行是關於一次做很多事。