隨著 Java 版本迭代,NIO 與 NIO.2 的支援日益完善;而 Node.js 最令人稱道的優勢之一,便是其高效能非阻塞 I/O 模型。這兩項技術雖屬應用層面,但其核心競爭力皆源於作業系統底層 I/O 模型的演進。本文將深入探討支撐 Java NIO.2 與 Node.js 的五大經典 I/O 模型,並釐清同步/非同步、阻塞/非阻塞的核心差異。
Node.js 與 Java NIO.2 未能在更早期湧現,根本原因在於作業系統底層支援技術尚不成熟。這兩項技術本質上是應用層框架,運行於 OS 之上。隨著 OS 發展,可支援的程式設計模型愈發豐富。最早享受紅利的往往是 C/C++,因為 OS 新增的多為系統呼叫,C/C++ 呼叫最便捷但也最複雜。其他平台為獲得同樣效能,必須持續演進、封裝,讓開發者能輕鬆使用這些紅利。封裝越友善,使用者越多,但也導致許多開發者僅知其然不知其所以然。
無論何種 OS 設計,以下五種 I/O 模型皆為核心基石:
最早、最基礎的模型。優點是程式設計簡單,缺點是系統呼叫阻塞用戶執行緒,導致 CPU 時間片浪費,I/O 效率低下。
改進了阻塞問題,但需要不斷輪詢檢查狀態,同樣浪費 CPU 時鐘週期。
現代 OS 提供最穩定的模型,主流應用(如 Node.js)多基於此構建。雖然本質是同步非阻塞,但平台常在其上封裝一層直接支援 AIO(非同步 I/O)。
因無效能優勢且系統支援不穩,鮮少被採用。
最理想的 AIO 模型,程式設計最簡單。但完美支援此模型的 OS 極少(Linux 正在努力)。一旦 OS 突破,編程框架與模型將進一步簡化。目前許多框架在用戶態模擬 AIO,讓開發者專注業務邏輯。
理解這些底層機制,有助於在架構選型與效能調優時做出更明智的決策。