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ình | Vai 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ế độ sandbox | src/vs/workbench/, src/vs/code/electron-browser/workbench/workbench.html |
| Shared process | Mộ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 Host | Chạy code của extension | src/vs/platform/extensions/electron-main/extensionHostStarter.ts (dùng WindowUtilityProcess), src/vs/workbench/api/ |
| Pty Host | Quả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
UtilityProcesstrongsrc/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 ProcessXem 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ình | UI chạy ở | Extension chạy ở | Script dev |
|---|---|---|---|
| Desktop | Electron renderer | Extension host Node.js cục bộ (+ web worker) | ./scripts/code.sh |
| VS Code for the Web | Trình duyệt | Web Worker trong trình duyệt | ./scripts/code-web.sh |
| Code Server Web | Trình duyệt | Node.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
- Tiến trình nào chạy trước, chạy như thế nào: Luồng khởi động (Startup flow)