libuv 非阻塞 I/O 概念與面試題解析
📌 1. 基本概念
libuv 是一個 C 語言實作的跨平台非同步 I/O 函式庫,最初為 Node.js 而生,支援 Linux / Windows / macOS。其功能包含事件迴圈(Event Loop)、非同步檔案 I/O、TCP/UDP socket、子行程控制、Thread pool 等。
✅ Node.js 核心將 JavaScript 的執行交給 V8,系統層的非同步操作交給 libuv。
📌 2. libuv 的角色
層級 | 技術 | 功能 |
---|---|---|
JS 執行層 | V8 引擎 | 執行 JS、處理微任務 |
非同步層 | libuv | 管理非同步任務與事件迴圈 |
系統層 | OS | 真正執行系統呼叫(如 I/O) |
📌 3. libuv 如 何處理非同步?
✅ 原理說明:
- JS 呼叫如 fs.readFile() 時,會託管給 libuv
- libuv 把任務加入其內部事件迴圈
- 若是檔案/壓縮等耗時操作,會委託 thread pool 執行
- 結果完成後加入 callback queue,等待事件迴圈處理
📌 4. libuv Thread Pool 機制
預設有 4 個 threads(可透過環境變數 UV_THREADPOOL_SIZE 設定上限為 128)。
常用於:
- fs.*
- crypto.*
- dns.lookup()
❗ 非 I/O 的 JS 運算(如排序)不會自動使用 thread pool。
📌 5. 事件循環(Event Loop)與 libuv 的整合流程
Node.js 事件迴圈分為以下階段(與 libuv 密切關聯):
階段名稱 | 處理對象 |
---|---|
timers | setTimeout / setInterval |
pending callbacks | 某些系統操作的回呼 |
idle, prepare | 內部使用 |
poll | I/O 事件發生與回應 |
check | setImmediate |
close callbacks | socket.on('close') |