Paul Butcher:seven Concurrency Models In Seven Weeks——when Threads Unravel@2014

提取的主要論點:

本資料(書籍《七週七併發模型》的介紹性內容)的核心論點聚焦於現代軟體開發中併發與並行的重要性、傳統方法的局限性以及探索多樣化併發模型的必要性。以下是主要論點的詳細解釋:

  1. 由於多核心處理器和硬體發展趨勢,併發與並行已成為現代軟體開發不可或缺的一部分。

    • 資料明確指出,隨著摩爾定律持續實現每個晶片上更多電晶體的承諾,硬體設計的重點已從提升單一 CPU 的速度轉向增加處理器核心的數量,這就是所謂的「多核心危機」。這意味著「免費午餐結束了」——開發者不能再僅僅依靠硬體速度的自然增長來提升程式效能。
    • 為了使程式運行得更快,特別是處理需要大量計算或處理大量資料的任務時,程式設計師必須顯式地利用多個核心,這直接要求程式具備並行能力。
    • 書中引用安德爾定律(Amdahl’s law)開始超越摩爾定律的現象,強調了從傳統的面向物件程式設計轉向面向併發程式設計的趨勢正在發生,這使得理解和應用併發模型比以往任何時候都更加重要。
  2. 併發的價值遠不止於利用多核心提升效能,它也是建構具備響應性、分布式、彈性和簡潔性軟體的關鍵。

    • 除了速度之外,資料擴展了併發的其他重要好處。一個「併發」的程式是指具有多個邏輯控制執行緒,能夠同時處理多個事件或任務(即使這些任務不一定物理上同時執行)。
    • 這種能力是實現軟體「響應性」的基礎,例如,讓使用者介面在執行背景任務時保持流暢,或讓網路伺服器能同時處理多個連接請求。
    • 在一個越來越多方面呈現「併發」和「分布式」的真實世界中,軟體也需要具備這些特性才能有效地互動。這包括地理位置的分散,以及處理硬體或軟體故障的「彈性」或「容錯」能力。併發通過任務之間的獨立性以及故障檢測機制來實現這一點。
    • 令人反直覺的是,在正確的語言和工具下,併發解決方案反而可能比其對應的順序解決方案更「簡單」和「清晰」,特別是當問題本身就具有併發結構時。
  3. 傳統的順序程式設計模型已不足以應對現代計算的需求。

    • 順序程式設計模型假定事情一個接一個地發生。然而,隨著對高性能、高響應性、分布式和高彈性系統的需求增加,這種模型無法直接適應需要「同時處理多件事」或「同時做多件事」的場景。
    • 因此,程式設計師需要超越傳統的思維模式,學習和應用能夠處理非順序執行的新模型。
  4. 執行緒與鎖(Threads and Locks)作為一種基本的併發模型,雖然廣泛使用,但也存在顯著的挑戰和陷阱。

    • 執行緒與鎖是許多其他併發模型的基礎,也是目前許多併發軟體的預設選擇。它們是底層硬體操作的直接形式化,因此非常簡單且靈活,幾乎所有語言都支援。
    • 然而,資料強調了這種模型的「原始性」、「難以駕馭」,並且相較於新技術,「不可靠且危險」。其核心問題在於對共享可變狀態的管理。
    • 主要的危險包括:競爭條件(race conditions)、死鎖(deadlocks)以及記憶體模型(memory model)帶來的可見性問題(即使沒有顯式鎖,編譯器、JVM 和硬體都可能重排操作,導致意外行為)。
    • 要正確使用執行緒與鎖,需要遵循嚴格的規則(同步訪問共享變數、固定順序獲取多個鎖、避免持有鎖時呼叫外部方法等),但這些規則難以在大規模程式中維持,且除錯(特別是記憶體模型問題和不常見的死鎖)極具挑戰性,自動化測試也難以完全覆蓋併發問題。這使其成為一種「費力不討好」的方法。
  5. 除了執行緒與鎖之外,還存在多種不同的、各有優勢的併發與並行模型。

    • 鑒於執行緒與鎖的困難,程式設計師需要了解並選擇更適合特定問題的更高層次或不同哲學的模型。
    • 書中列出了七種不同的模型,旨在提供廣闊的視角:執行緒與鎖(基礎但有問題)、函數式程式設計(通過消除可變狀態簡化併發)、Clojure 的 Identity/State 分離(函數式與可變狀態的實用結合)、Actor 模型(通過消息傳遞隔離狀態)、CSP(強調通道)、資料並行(利用 SIMD/GPU)以及 Lambda 架構(用於大數據的分布式並行)。
    • 這些模型各有其「甜蜜點」(sweet spot),適用於不同的問題類型(併發 vs. 並行)、目標硬體架構(共享記憶體 vs. 分布式)以及對彈性或分布式能力的需求。
  6. 對於現代程式設計師而言,理解並掌握這些多樣化的併發模型至關重要,以便為特定問題選擇最合適的工具。

    • 資料多次強調,隨著多核心時代的到來,理解併發對於每個工作程式設計師都變得越來越重要。
    • 了解不同的模型可以擴展程式設計師的「工具箱」,使其能根據問題的需求,選擇能夠帶來效能提升、代碼簡潔性、彈性或分布式能力的最佳方法,而不是僅僅局限於執行緒與鎖這種低層次且危險的工具。
    • 書的目的是通過實際動手實踐來深入探索這些模型,幫助讀者理解它們的工作原理、優勢和劣勢,最終能根據具體場景做出明智的選擇。

總之,資料的核心信息是:併發和並行已是時代大勢,傳統的執行緒與鎖是困難且有風險的,現代程式設計師需要了解並掌握多種多樣的併發模型,以應對從效能提升到建構彈性分布式系統的各種挑戰,並為不同的問題選擇最有效的解決方案。