本章導覽#
行程(process)的概念源自作業系統領域,一般定義為「執行中的程式」。從作業系統的角度來看,行程的管理與排程或許是最重要的議題;但在分散式系統中,其他議題同樣重要、甚至更為關鍵。本章從分散式系統的視角,逐一檢視各種型態的行程所扮演的角色:
- 執行緒(thread):要有效率地組織主從式(client-server)系統,多執行緒技術往往不可或缺。執行緒在分散式系統中的主要貢獻,是讓客戶端與伺服器的「通訊」與「本地處理」得以重疊,帶來高效能。
- 虛擬化(virtualization):讓應用程式(甚至連同其完整環境與作業系統)與其他應用程式並行執行,卻高度獨立於底層硬體與平台,帶來高可攜性;同時有助於隔離錯誤或安全問題造成的失效。
- 客戶端與伺服器的剖析:延續第 2 章對主從式組織的討論,深入客戶端與伺服器的典型組織方式,以及伺服器的一般設計議題。
- 程式碼遷移(code migration):在廣域分散式系統中,把行程在機器之間搬移是重要議題。程式碼遷移有助於達成可擴縮性,也能動態配置客戶端與伺服器。
本章重點#
- 執行緒讓阻塞式 I/O 進行時 CPU 仍可繼續工作,是打造高效率伺服器的基礎:多條執行緒並行,其中數條可安心阻塞等候磁碟或網路 I/O 完成。
- 客戶端行程通常實作使用者介面(從簡單顯示到能處理複合文件的進階介面),並負責達成分散透明性:隱藏與伺服器通訊的細節、伺服器目前位置與是否被複製,也分擔失效遮蔽與復原的工作。
- 伺服器雖較客戶端複雜,設計議題卻相對集中:迭代式或並行式、實作單一或多重服務、無狀態或有狀態,以及服務的定址方式與「請求已送出後如何中斷伺服器」的機制。
- 伺服器叢集的共同目標是對外隱藏叢集內部結構:多數叢集以單一進入點把訊息轉交給叢集內的伺服器;把這個單一進入點換成完全分散式的方案,則是具挑戰性的問題。
- 程式碼遷移的兩大動機是效能與彈性:通訊昂貴時可把運算送到資料所在地就近處理;客戶端也可動態下載與特定伺服器溝通所需的軟體,免除預先安裝。
- 程式碼遷移帶來本地資源使用的問題——資源得一併遷移、在目標機器重新繫結,或改用全系統的網路參照;異質性問題目前實務上最佳解是虛擬機器,包括行程虛擬機器(如 Java)與能連同底層作業系統一起搬移整組行程的虛擬機器監視器。