歡迎來到併發思考(Thinking Concurrently)的世界!

在本章中,我們將探討計算機科學家工具箱中最強大的工具之一:併發(Concurrency)。過去,電腦一次只能做一件事,雖然速度很快,但畢竟是單線程的。如今,我們透過「同時做多件事」來解決問題。無論你是遊戲高手,還是討厭等待應用程式載入的人,理解如何進行「併發思考」正是打造超高速、高效率軟體的秘訣。

如果剛開始覺得有點「燒腦」,別擔心!我們人類天生傾向於線性思考(一步接一步),但只要幾個簡單的類比,你很快就能學會如何進行平行思維。


1. 什麼是併發思考?

簡單來說,併發思考就是面對一個大問題時,判斷哪些部分可以同時處理,而不是一定要等前一個任務完成後才開始下一個。

「週日晚餐」類比

想像你要準備一頓豐盛的晚餐。如果你是「線性思考」,你會:
1. 削馬鈴薯皮。
2. 煮馬鈴薯。
3. 等馬鈴薯煮好。
4. 開始煮肉。
5. 等肉煮好。
6. 最後,做肉汁。

這樣你可能要到午夜才能吃飯!相反地,如果你併發思考:當馬鈴薯在煮的時候,你會把肉放進烤箱。當兩者都在烹調時,你再去調製肉汁。你是在同時管理多個任務,從而更快達成目標。

重點複習:併發是關於管理多個開始、執行並在時間上重疊的任務。它並不總是意味著它們在同一個毫秒內精確地同時進行,而是它們都處於「進行中」的狀態。


2. 識別問題的組成部分(課程大綱 2.1.5a)

考試中你需要的第一個技能,就是能夠判斷問題的哪些部分可以同時進行。

要做到這一點,你必須找出依賴關係(Dependencies)。所謂依賴關係,是指任務 B 在開始之前,必須等待任務 A 的結果。

如何識別併發任務:
  • 獨立任務(Independent Tasks):如果任務 A 和任務 B 不需要對方的數據,它們就可以併發執行。(例如:在電子遊戲中,計算風的流動和計算角色披風的擺動。)
  • 依賴任務(Dependent Tasks):如果任務 B 需要任務 A 的輸出,它們就不能併發。(例如:你無法計算角色的剩餘生命值,直到你計算出敵人造成的傷害值。)

你知道嗎?現代處理器擁有「多個核心」。併發思考讓我們可以將任務 A 指派給一個核心,任務 B 指派給另一個核心,從而實質上將生產力翻倍!


3. 優勢與取捨(課程大綱 2.1.5b)

在考試中,你常會被問到程式設計師為何會選擇(或避免)併發處理。這並不總是「百利而無一害」的!

優勢(好處)

1. 提高吞吐量(Throughput):在更短的時間內完成更多工作。
2. 提升反應速度:在網頁瀏覽器中,程式的一部分負責處理使用者的點擊(UI),同時另一部分在背景下載高清圖片。這能防止應用程式出現「凍結」狀態。
3. 硬體資源的高效利用:充分利用多核心 CPU,確保處理器的每一部分都不會閒置。

取捨(挑戰)

1. 複雜性:編寫和偵錯併發程式困難得多。人類很容易跟隨一條直線,但要同時追蹤十件正在發生的事情卻很難!
2. 競爭條件(Race Conditions):這點非常關鍵!當兩個任務同時嘗試更新同一塊數據時,就會發生競爭條件
例如:兩個人在同一毫秒嘗試從餘額為 \$15 的銀行帳戶中提款 \$10。如果系統不夠謹慎,它可能會允許兩次提款同時發生,因為它們在餘額更新前都「檢查」到了帳戶有錢!
3. 額外開銷(Overhead):管理這些任務(在它們之間切換並進行同步)本身就需要消耗時間和記憶體。如果任務太小,這些「管理時間」可能會比「執行時間」更長。


4. 總結與關鍵重點

必須記住的關鍵術語:

  • 併發(Concurrency):透過重疊執行來處理多個任務。
  • 平行處理(Parallel Processing):併發的一種子類型,任務在不同的處理器/核心上真正同時執行。
  • 依賴關係(Dependency):一個任務依賴另一個任務的完成或數據。
記憶口訣:併發挑戰的「3個 S」

如果你在考試中卡住了,請記住併發為何困難:
1. Safety(安全性:競爭條件 / 數據損壞)
2. Synchronization(同步化:確保任務在需要時互相等待)
3. Scheduling(排程:作業系統必須決定哪個任務何時執行)

要避免的常見錯誤:不要以為所有事情都可以併發!有些問題是「尷尬線性」的。例如,如果你要計算一個數列,其中每個數字都基於前一個數字(如斐波那契數列),你必須按順序、一步一步地執行。

做得好!你剛剛掌握了 OCR A Level 併發思考的核心精髓。記住:找出依賴關係,權衡速度與複雜度,並留意那些競爭條件!