Blink và V8 nằm ở đâu trong Chromium: tiến trình trình duyệt, renderer, GPU và mạng, vì sao tách riêng và Site Isolation đóng vai trò gì.
Mở trình quản lý tác vụ tích hợp của Chrome, bạn sẽ không thấy một chương trình tên "Chrome" mà là một danh sách các tiến trình riêng biệt: một cho chính trình duyệt, một hoặc nhiều cho các trang web, một cho GPU, một cho mạng. Danh sách đó chính là toàn bộ kiến trúc thu nhỏ. Chromium, dự án mã nguồn mở nằm dưới Chrome, Edge, Brave và Opera, không phải một engine duy nhất chạy trong một khối bộ nhớ, mà là một tập các tiến trình phối hợp với nhau; Blink (engine hiển thị) và V8 (engine JavaScript) chỉ nằm trong một loại tiến trình. Bài này trả lời đúng một câu hỏi: Blink và V8 nằm ở đâu trong Chromium, và các tiến trình chia việc thế nào?
Điểm chính
- Chromium chạy dưới dạng nhiều tiến trình: một tiến trình trình duyệt có đặc quyền lo giao diện, thẻ và điều phối, cùng các tiến trình renderer bị cô lập trong sandbox, một tiến trình GPU, và các dịch vụ mạng cùng tiện ích.
- Blink và V8 chạy bên trong tiến trình renderer. Đây là nơi phân tích HTML, chạy JavaScript của trang và tính bố cục — và cố ý là phần ít được tin cậy nhất.
- Việc tách này phục vụ độ ổn định và an toàn: một trang bị sập không được kéo sập cả trình duyệt, và một trang bị xâm nhập không được đọc tệp của bạn hay dữ liệu của trang khác.
- Site Isolation (cô lập trang) đi xa hơn, cố giữ các trang của những site khác nhau trong các tiến trình renderer khác nhau, một lớp phòng thủ được tăng cường sau các lỗ hổng CPU kiểu Spectre.
- Mọi trình duyệt dựa trên Chromium đều dùng chung cấu trúc này, là một lý do khiến các đặc điểm cấp engine khó bị làm giả.
Mô hình trong một câu
Tài liệu thiết kế kiến trúc đa tiến trình của Chromium nêu ý tưởng khá thẳng: chạy mã xử lý nội dung web không đáng tin trong các tiến trình riêng, bị hạn chế, và để một tiến trình có đặc quyền duy nhất nắm quyền điều khiển. Loạt bài Inside look at modern web browser của Google kể cùng câu chuyện từ phía người dùng, với cùng dàn tiến trình. Nếu bạn muốn hiểu engine là gì trước, hãy đọc giải thích về engine trình duyệt rồi quay lại.
Ai chạy ở đâu
Cách bố trí tiến trình của Chromium đã thay đổi nhiều năm qua và tài liệu thiết kế có chỗ đã lỗi thời, vì vậy hãy coi phần dưới đây là lõi ổn định chứ không phải danh sách tiến trình hiện hành. Cả hai nguồn đều thống nhất về các vai trò này.
| Tiến trình | Chạy gì ở đó | Có thể chạm tới gì |
|---|---|---|
| Trình duyệt | Cửa sổ, thanh địa chỉ, dấu trang, nút tiến và lùi; điều phối mọi tiến trình khác | Đặc quyền cao nhất: tệp, tài nguyên hệ thống, giao diện và quyền điều khiển mọi tiến trình khác |
| Renderer | Blink (HTML, CSS, bố cục, vẽ) và V8 (JavaScript) cho nội dung web | Rất ít: chạy trong sandbox, mọi thứ ngoài đó phải xin tiến trình trình duyệt |
| GPU | Công việc giao cho phần cứng đồ họa, như ghép lớp và vẽ | Trình điều khiển đồ họa, tách biệt với các trang yêu cầu vẽ |
| Mạng và dịch vụ tiện ích khác | Tải tài nguyên, cùng các tác vụ phụ an toàn hơn khi đặt ngoài tiến trình trình duyệt | Truy cập mạng, nhưng không dùng chung tiến trình với mã của trang |
Điểm mấu chốt nằm ở hàng giữa. Nội dung trang trong một thẻ do tiến trình renderer xử lý, và đó là nơi hai nửa của cặp engine gặp nhau. Nếu bạn đã đọc engine hiển thị so với engine JavaScript, thì việc "hai engine phối hợp trong một lần tải trang" diễn ra ngay trong một tiến trình renderer: Blink dựng DOM và bố cục, V8 chạy các script có thể thay đổi chúng, và không bên nào phải vượt ranh giới tiến trình.
Vì sao phải tách trình duyệt ra
Hai vấn đề thúc đẩy thiết kế này, đều được nêu trong tài liệu thiết kế và bài phân tích của Google.
Sự cố sập. Trang web chạy mã tùy ý và đôi khi treo hoặc sập. Nếu mọi thứ dùng chung một tiến trình, một thẻ xấu sẽ kéo theo mọi thẻ khác và phiên làm việc của bạn. Với các tiến trình renderer riêng, sự cố được khoanh vùng: tiến trình trình duyệt vẫn sống và hiển thị thông báo "trang bị sập" quen thuộc chỉ ở thẻ đó.
Sandbox. Blink và V8 là những chương trình khổng lồ, phức tạp, ngày nào cũng phân tích dữ liệu đầu vào độc hại, nên lỗi là điều khó tránh. Chromium giả định một số lỗi có thể bị khai thác và giới hạn thiệt hại: renderer chạy với quyền hạn chế, và khi cần đọc tệp hay mở kết nối mạng, nó phải xin tiến trình trình duyệt (và các dịch vụ do tiến trình này quản lý), và yêu cầu đó có thể bị từ chối. Vì vậy renderer bị xâm nhập không đồng nghĩa với máy của bạn bị xâm nhập. Cái giá là chi phí: nhiều tiến trình hơn thì tốn bộ nhớ hơn và cần truyền thông điệp giữa chúng, một sự đánh đổi mà nhóm Chromium chấp nhận để đổi lấy an toàn.
Site Isolation: một site, một tiến trình
Một thẻ không bằng một tiến trình, và ranh giới tiến trình quan trọng nhất giữa các website. Site Isolation nhắm tới việc để một tiến trình renderer chỉ chứa trang của một site duy nhất, để trang của site này không nằm chung bộ nhớ tiến trình với trang của site khác — kể cả các iframe nhúng, vốn có thể được hiển thị ở tiến trình khác với trang nhúng chúng. Chrome bật Site Isolation mặc định cho người dùng máy tính từ Chrome 67 vào năm 2018; trên Android, tính năng này được áp dụng có chọn lọc hơn vì điện thoại ít bộ nhớ dư hơn.
Động lực trở nên cấp thiết hơn sau Spectre, nhóm lỗ hổng thực thi suy đoán của CPU được công bố năm 2018. Các cuộc tấn công kiểu này có thể cho phép mã đọc bộ nhớ ở nơi khác trong cùng tiến trình, nên một trang độc hại dùng chung tiến trình với trang ngân hàng về nguyên tắc có thể thử đọc dữ liệu mà nó không được thấy. Đặt hai trang vào hai tiến trình khác nhau đưa vùng nhớ đó ra ngoài tầm với, và để tiến trình trình duyệt làm trọng tài thay vì tin vào trang. Khía cạnh bộ đếm thời gian của cùng câu chuyện — vì sao trình duyệt làm thô đồng hồ để các cuộc tấn công này khó hơn — được nói trong bài độ chính xác bộ đếm thời gian của trình duyệt.
Chúng tôi không đưa ra con số về chi phí bộ nhớ hay hiệu năng ở đây, vì chúng thay đổi nhiều theo thiết bị, trang và phiên bản Chromium, và các trang chính thức không có con số duy nhất nào đáng trích dẫn.
Tự xem trên máy của bạn
Bạn không cần công cụ đặc biệt nào để thấy kiến trúc này hoạt động:
- Trình quản lý tác vụ. Trong Chrome, mở menu rồi chọn Công cụ khác → Trình quản lý tác vụ (hoặc nhấn Shift+Esc trên Windows, Linux và ChromeOS). Mỗi hàng là một tiến trình: trình duyệt, tiến trình GPU, các dịch vụ tiện ích như dịch vụ mạng, và các tiến trình renderer kèm nhãn cho biết chúng phục vụ thẻ hay frame nào. Hãy mở hai thẻ cùng một site và hai thẻ của hai site khác nhau, rồi so sánh mã tiến trình (process ID).
- chrome://process-internals. Trang nội bộ này cho biết trình duyệt đang chạy ở chế độ Site Isolation nào và frame nào nằm trong tiến trình nào. Hãy tự gõ địa chỉ vào thanh địa chỉ; trang web không được phép liên kết tới nó.
Điều này nghĩa là gì với việc nhận diện dấu vân tay
Với độc giả BrowserInsight có một hệ quả thực tế. Edge, Brave, Opera, Vivaldi và Chrome đều thừa hưởng cấu trúc này từ Chromium; chúng khác nhau ở thương hiệu, thiết lập mặc định và dịch vụ, chứ không phải ở việc Blink và V8 chạy trong renderer có sandbox. Đó là lý do kiểm tra engine của chúng tôi báo engine Blink/Chromium cho tất cả, như đã bàn trong Chromium và Chrome và vì sao nhiều trình duyệt dùng Chromium.
Đó cũng là lý do hành vi cấp engine khó bắt chước. Một script có thể làm giả chuỗi User-Agent nhưng không thể đổi engine JavaScript thực sự đang chạy mã (dấu vân tay engine JavaScript), và tập tính năng web mà một bản dựng hỗ trợ đi theo phiên bản (phát hiện phiên bản engine qua tính năng). Headless Chrome chạy cùng ngăn xếp Blink và V8, nên tự động hóa bị phát hiện bằng hành vi và kiểm tra tính nhất quán chứ không phải bằng một engine khác — xem kỹ thuật phát hiện bot.
Một giới hạn cần nói thật: kiểm tra engine nhận diện engine và phiên bản dựa trên các tính năng trình duyệt hỗ trợ. Nó không xem xét tiến trình của bạn và không cho biết Site Isolation có bật hay không. Để biết điều đó, hãy dùng trình quản lý tác vụ và chrome://process-internals đã nói ở trên.
Câu hỏi thường gặp
Chromium là một tiến trình hay nhiều?
Nhiều. Một tiến trình trình duyệt có đặc quyền điều phối các tiến trình renderer trong sandbox, tiến trình GPU và các dịch vụ mạng, tiện ích. Con số cụ thể thay đổi theo các trang bạn mở và phiên bản Chromium.
Blink và V8 có chạy trong tiến trình trình duyệt không?
Không. Cả hai chạy trong tiến trình renderer, trong sandbox, vì chúng xử lý nội dung web không đáng tin. Tiến trình trình duyệt lo giao diện, điều phối và mọi việc cần quyền cao.
Mỗi thẻ có một tiến trình riêng không?
Không hẳn. Thẻ và site có liên quan nhưng không đồng nhất: Site Isolation nhắm tới một site cho mỗi tiến trình renderer, và các frame nhúng khác site có thể nằm ở tiến trình khác với trang bao quanh. Chromium cũng có thể chia sẻ hoặc tái sử dụng tiến trình trong một số trường hợp.
Điều này có khiến Chrome an toàn hơn các trình duyệt khác không?
Nó khiến trình duyệt dựa trên Chromium khó bị khai thác hơn ở một số mặt, nhưng cô lập tiến trình chỉ là một lớp trong nhiều lớp, và các engine khác cũng có thiết kế đa tiến trình riêng. An toàn còn phụ thuộc vào bản cập nhật, tiện ích mở rộng và thói quen của bạn.
Kết luận
Nên xem Chromium như một tổ chức nhỏ hơn là một chương trình đơn lẻ: một người quản lý có đặc quyền, vài chuyên viên, và một renderer trong sandbox nơi Blink và V8 biến một trang không đáng tin thành các điểm ảnh. Việc tách này mang lại khả năng khoanh vùng sự cố và phạm vi ảnh hưởng nhỏ hơn, còn Site Isolation mở rộng điều đó sang việc tách các website khỏi nhau. Biết hai engine nằm ở đâu giúp giải thích vì sao các trình duyệt họ Chromium hành xử giống nhau và vì sao ngăn xếp chung này hữu ích để phân biệt trình duyệt thật với hàng giả.


