Kiến trúc đa tiến trình (Multi-process Architecture)

← Về MOC · Trước: Môi trường đích (Target Environments)

1. Vì sao VS Code chạy nhiều tiến trình?

Wiki How to Contribute (mục Debugging) nêu rõ: VS Code có kiến trúc multi-process (đa tiến trình), code của bạn có thể chạy ở các tiến trình khác nhau. Lợi ích:

  • Ổn định: một extension lỗi/treo không làm treo giao diện.
  • Bảo mật: cửa sổ giao diện chạy trong sandbox (bị cô lập), không truy cập Node.js trực tiếp.
  • Hiệu năng: việc nặng (tìm kiếm, terminal, theo dõi file) chạy song song, không chặn UI.

Process (tiến trình) là gì?

Một process là một chương trình đang chạy với vùng bộ nhớ riêng. Các process không dùng chung biến; muốn trao đổi phải qua IPC (Inter-Process Communication – giao tiếp liên tiến trình), tương tự hai ứng dụng gửi thông điệp cho nhau.

2. Các tiến trình chính (bản desktop)

flowchart LR
  Main["Main process<br/>(Electron main)<br/>src/vs/code/electron-main"]
  R1["Renderer – cửa sổ 1<br/>(workbench, sandbox)"]
  R2["Renderer – cửa sổ 2"]
  Shared["Shared process<br/>(utility process)"]
  EH["Extension Host<br/>(utility process, Node.js)"]
  Pty["Pty Host<br/>(terminal)"]
  Main --> R1 & R2
  Main --> Shared
  Main --> Pty
  R1 <-->|RPC| EH
  R1 <-->|IPC| Main
  R1 <-->|IPC| Shared
Tiến trìnhVai tròCode liên quan
Main (Electron main)Khởi động ứng dụng, quản lý cửa sổ, menu, vòng đời (lifecycle)src/main.ts, src/vs/code/electron-main/
Renderer (mỗi cửa sổ một renderer)Chạy workbench – toàn bộ giao diện. Chạy ở chế độ sandboxsrc/vs/workbench/, src/vs/code/electron-browser/workbench/workbench.html
Shared processMột tiến trình dùng chung cho mọi cửa sổ: quản lý extension (cài/gỡ), đồng bộ cài đặt…src/vs/platform/sharedProcess/ (khởi chạy bằng UtilityProcess)
Extension HostChạy code của extensionsrc/vs/platform/extensions/electron-main/extensionHostStarter.ts (dùng WindowUtilityProcess), src/vs/workbench/api/
Pty HostQuản lý terminal tích hợp (pty – pseudo terminal, terminal giả lập)src/vs/platform/terminal/electron-main/electronPtyHostStarter.ts
Search, Agent Host…Tìm kiếm file, chạy AI agent…Có cấu hình “Attach to …” riêng trong .vscode/launch.json

Utility process

Utility process là loại tiến trình phụ do Electron cung cấp, chạy Node.js nhưng tách khỏi main. VS Code dùng nó cho shared process, extension host, pty host… (thấy rõ qua lớp UtilityProcess trong src/vs/platform/utilityProcess/electron-main/utilityProcess.ts).

Bằng chứng từ cấu hình debug

File .vscode/launch.json có các cấu hình gắn debugger vào từng tiến trình – đây chính là danh sách tiến trình thực tế:

Attach to Extension Host
Attach to Shared Process
Attach to Search Process
Attach to Pty Host Process
Attach to Agent Host Process
Attach to CLI Process
Attach to Main Process

Xem cách dùng ở Debug VS Code.

3. Các cấu hình chạy khác nhau

Cùng một code base, VS Code chạy được ở nhiều cấu hình (wiki How to Contribute + tài liệu Extension Host):

Cấu hìnhUI chạy ởExtension chạy ởScript dev
DesktopElectron rendererExtension host Node.js cục bộ (+ web worker)./scripts/code.sh
VS Code for the WebTrình duyệtWeb Worker trong trình duyệt./scripts/code-web.sh
Code Server WebTrình duyệtNode.js phía server./scripts/code-server.sh --launch
Remote (SSH/Container/WSL)Máy cục bộExtension host Node.js ở máy từ xa (src/vs/server)—

Chi tiết về các loại extension host: Extension Host & RPC.

4. Giao tiếp giữa các tiến trình

  • Giữa renderer ↔ main/shared process: kênh IPC (src/vs/base/parts/ipc/).
  • Giữa workbench ↔ extension host: giao thức RPC (Remote Procedure Call – gọi hàm từ xa như gọi hàm cục bộ) định nghĩa trong src/vs/workbench/api/common/extHost.protocol.ts.

Hệ quả quan trọng cho người viết extension: phần lớn API cần dữ liệu từ giao diện trả về Thenable/Promise (bất đồng bộ – async), vì dữ liệu phải đi qua ranh giới tiến trình. Ngay cả API trông như đồng bộ (gán statusBarItem.text = ...) thì bên dưới cũng chỉ gửi thông điệp một chiều sang workbench.

Liên kết