勇闖Chromium—— Chromium的多進程架構

問題

構建一個永不崩潰或掛起的渲染引擎幾乎是不可能的,構建一個絕對安全的渲染引擎也幾乎是不可能的。

從某種程度上來說,2006 年左右的網絡瀏覽器狀態與過去單用戶、協作式多任務操作系統的狀況類似。正如在這樣的操作系統中,一個行為不端的應用程序可能導致整個系統崩潰一樣,網絡瀏覽器中一個行為不端的網頁也可能導致整個瀏覽器和所有當前正在運行的標簽頁崩潰。只需一個渲染引擎或插件錯誤,就能導致整個瀏覽器和所有當前正在運行的標簽頁崩潰。

現代操作系統更加健壯,因為它們將應用程序置于彼此隔離的獨立進程中。一個應用程序的崩潰通常不會影響其他應用程序或操作系統的完整性,并且每個用戶對其他用戶數據的訪問也受到限制。Chromium 的架構旨在實現這種更健壯的設計。

架構概述

Chromium 使用多個進程來保護整個應用程序免受渲染引擎或其他組件中的錯誤和故障的影響。它還限制每個渲染引擎進程對其他進程以及系統其余部分的訪問。從某種程度上來說,這為網頁瀏覽帶來了內存保護和訪問控制為操作系統帶來的好處。

我們將運行 UI 并管理渲染器和其他進程的主進程稱為“瀏覽器進程”或“瀏覽器”。同樣,處理 Web 內容的進程稱為“渲染器進程”或“渲染器”。渲染器使用Blink開源布局引擎來解釋和布局 HTML。
在這里插入圖片描述
從圖中可以看到:一個渲染進程可能有多個RenderView視圖,對應瀏覽器進程中的RenderViewHost(在灰色陰影區域中標識)。兩者以瀏覽器進程中的I/O線程為橋梁,通過IPC通信。這種結構為一個渲染進程對應的RenderView創建子RenderView提供了可能,例如在cef中,創建子窗體。如果主窗體的標簽頁關閉了,子窗體也要關閉。

管理渲染器進程

每個渲染器進程都有一個全局RenderProcess對象,用于管理與父瀏覽器進程的通信并維護全局狀態。瀏覽器RenderProcessHost為每個渲染器進程維護一個對應的對象,用于管理瀏覽器狀態以及與渲染器的通信。瀏覽器和渲染器使用 Mojo或 Chromium 的傳統 IPC 系統進行通信。

管理框架和文檔

每個渲染器進程都有一個或多個RenderFrame對象,這些對象對應于包含內容的文檔所在的框架。RenderFrameHost瀏覽器進程中的相應對象管理與該文檔相關的狀態。每個對象都 RenderFrame被賦予一個路由 ID,用于區分同一渲染器中的多個文檔或框架。這些 ID 在一個渲染器內部是唯一的,但在瀏覽器內部則不同,因此識別一個框架需要同時擁有一個RenderProcessHost和路由 ID。從瀏覽器到渲染器中特定文檔的通信是通過這些RenderFrameHost 對象完成的,這些對象知道如何通過 Mojo 或傳統的進程間通信 (IPC) 發送消息。

組件和接口

在渲染器進程中:

  • 處理RenderProcessMojo 設置以及瀏覽器中相應的舊式 IPC RenderProcessHost。每個渲染器進程只有一個 RenderProcess對象。
  • 該RenderFrame對象與瀏覽器進程中的對應對象 RenderFrameHost(通過 Mojo)以及 Blink 層進行通信。該對象表示選項卡或子框架中一個 Web 文檔的內容。

在瀏覽器進程中:

  • 該Browser對象代表頂級瀏覽器窗口。
  • 該RenderProcessHost對象表示單個瀏覽器 ? 渲染器 IPC 連接的瀏覽器端。RenderProcessHost每個渲染器進程在瀏覽器進程中都有一個對應的對象。
  • 該RenderFrameHost對象封裝了與的通信 RenderFrame,RenderWidgetHost處理瀏覽器中的輸入和繪畫對于RenderWidget的。

有關此嵌入如何工作的更多詳細信息,請參閱Chromium 如何顯示網頁設計文檔。(這個單獨起一篇文章

共享渲染器進程

通常,每個新窗口或標簽頁都會在一個新進程中打開。瀏覽器會生成一個新進程,并指示其創建一個單獨的RenderFrame,這可能會在頁面中創建更多 iframe(可能在不同的進程中)。

有時,在標簽頁或窗口之間共享渲染器進程是必要的或理想的。例如,一個 Web 應用可以用來window.open創建另一個窗口,而新文檔如果屬于同一源,則必須共享同一個進程。如果進程總數過大,Chromium 也有一些策略可以將新標簽頁分配給現有進程。這些注意事項和策略在“進程模型”中進行了描述。

檢測崩潰或行為異常的渲染器

每個與瀏覽器進程的 Mojo 或 IPC 連接都會監視進程句柄。如果這些句柄收到信號,則表示渲染器進程已崩潰,受影響的標簽頁和框架會收到崩潰通知。Chromium 會顯示“糟糕的標簽頁”或“糟糕的框架”圖像,通知用戶渲染器已崩潰。您可以通過點擊“重新加載”按鈕或啟動新的導航來重新加載頁面。當這種情況發生時,Chromium 會注意到渲染器進程已不存在,并創建一個新的渲染器進程。

渲染器沙盒化

由于渲染器在單獨的進程中運行,我們可以通過

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906919.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MYSQL中的分庫分表及產生的分布式問題

分庫分表是分布式數據庫架構中常用的優化手段,用于解決單庫單表數據量過大、性能瓶頸等問題。其核心思想是將數據分散到多個數據庫(分庫)或多個表(分表)中,以提升系統的吞吐量、查詢性能和可擴展性。 一&am…

GAMES104 Piccolo引擎搭建配置

操作系統:windows11 家庭版 inter 17 12 th 顯卡:amd 運行內存:>12 1、如何構建? 在github下載:網址如下 https://github.com/BoomingTech/Piccolo 下載后安裝 git、vs2022 Git Visual Studio 2022 IDE - …

頁表:從虛擬內存到物理內存的轉換

目錄 引言 虛擬內存 頁表 單級頁表 頁表項 單級頁表的不足 二級頁表 四級頁表 快表TLB 結語 引言 一個系統中,CPU和內存是被所有進程共享的,而且一個系統中往往運行著多個進程。如果一個進程不小心寫了另一個進程的內存,那么被寫入…

互聯網大廠Java求職面試:短視頻平臺大規模實時互動系統架構設計

互聯網大廠Java求職面試:短視頻平臺大規模實時互動系統架構設計 面試背景介紹 技術總監(嚴肅臉): 歡迎來到我們今天的模擬面試,我是技術部的李總監,負責平臺后端架構和高可用系統設計。今天我們將圍繞一個…

網絡段、主機段、子網掩碼

子網掩碼把 IP 切割成了網絡段和主機段兩部分。同一網段下的不同主機之間可以互通網絡。 掩碼 IPV4 默認情況下 IP 地址 192.168.0.x 可以分配 256 個主機地址(不考慮首尾兩個特殊的地址時)。 假設我們只需要用到 8 個主機,就可以借助子網掩…

從零搭建SpringBoot Web 單體項目2、SpringBoot 整合數據庫

系列文章 從零搭建SpringBoot Web單體項目【基礎篇】1、IDEA搭建SpringBoot項目 從零搭建 SpringBoot Web 單體項目【基礎篇】2、SpringBoot 整合數據庫 目錄 一、項目基礎環境說明 二、數據庫整合流程 1. 添加 MyBatis-Plus 相關依賴(pom.xml) 2…

4款頂級磁力下載工具,速度提升器,可以變下變播

今天給大家帶來一些超給力的磁力下載工具,速度飛快,最高可達20MB/s,而且還能邊下邊播! 下載鏈接:夸克網盤分享(點擊藍色字體自行保存下載) 一、柚子下載 柚子下載界面干凈,沒有廣…

怎樣判斷服務器網絡質量的狀態?

服務器存儲著企業的重要數據信息,服務器的網絡質量會影響到用戶訪問數據信息的速度,也決定著網站頁面是否會出現卡頓或頁面崩潰的情況,那我們對于服務器中網絡質量的狀態該如何進行判斷呢? 服務器的網絡狀態通常是指服務器與外部網…

零基礎入門Selenium自動化測試:自動登錄edu郵箱

🌟 Selenium簡單概述一下 Selenium 是一個開源的自動化測試工具,主要用于 Web 應用程序的功能測試。它能夠模擬用戶操作瀏覽器的行為(如點擊按鈕、填寫表單、導航頁面等),應用于前端開發、測試和運維領域。 特點 跨…

day36 python神經網絡訓練

目錄 一、數據準備與預處理 二、數據集劃分與歸一化 三、構建神經網絡模型 四、定義損失函數和優化器 五、訓練模型 六、評估模型 在機器學習和深度學習的實踐中,信貸風險評估是一個非常重要的應用場景。通過構建神經網絡模型,我們可以對客戶的信用…

如何確定是不是一個bug?

在軟件測試過程中,我們經常會遇到一些異常現象,但并非所有異常都是Bug。如何準確判斷一個問題是否屬于Bug?本文將從Bug的定義、判定標準、常見誤區和實戰技巧四個方面展開,幫助測試工程師提高Bug判定的準確性。 1. Bug的定義:什么情況下算Bug? 一個Bug(缺陷)通常指軟件…

Lombok與Jackson實現高效JSON序列化與反序列化

引言 在Java開發中,處理JSON數據是常見需求,而Jackson作為廣泛使用的JSON庫,能夠高效地將Java對象與JSON互相轉換。然而,傳統的POJO(Plain Old Java Object)需要手動編寫大量樣板代碼(如getter…

論文閱讀:PURPLE: Making a Large Language Model a Better SQL Writer

論文地址:PURPLE: Making a Large Language Model a Better SQL Writer 摘要 大語言模型(LLM)技術在自然語言到 SQL(NL2SQL)翻譯中扮演著越來越重要的角色。通過大量語料訓練的 LLM 具有強大的自然語言理解能力和基本…

【圖像大模型】ControlNet:深度條件控制的生成模型架構解析

ControlNet:深度條件控制的生成模型架構解析 一、核心原理與技術突破1.1 基礎架構設計1.2 零卷積初始化1.3 多條件控制機制 二、系統架構與實現細節2.1 完整處理流程2.2 性能指標對比 三、實戰部署指南3.1 環境配置3.2 基礎推理代碼3.3 高級控制參數 四、典型問題解…

【從0到1搞懂大模型】chatGPT 中的對齊優化(RLHF)講解與實戰(9)

GPT系列模型的演進 chatgpt系列模型演進的重要節點包含下面幾個模型(當然,這兩年模型發展太快了,4o這些推理模型我就先不寫了) (Transformer) → GPT-1 → GPT-2 → GPT-3 → InstructGPT/ChatGPT(GPT-3.5) → GPT-4 下面介紹一…

2025年AEI SCI1區TOP,改進麻雀搜索算法MSSA+建筑三維重建,深度解析+性能實測

目錄 1.摘要2.麻雀搜索算法SSA原理3.整體框架4.改進SSA算法5.結果展示6.參考文獻7.代碼獲取8.讀者交流 1.摘要 對現有建筑進行高質量的三維重建對于其維護、修復和管理至關重要。圖像采集中的有效視角規劃會顯著影響基于攝影測量的三維重建質量。復雜的建筑結構常常導致傳統視…

鴻蒙開發:如何實現列表吸頂

前言 本文基于Api13 列表吸頂功能,在實際的開發中有著很大的作用,比如可以讓列表層級之間更加分明,減少一定程度上的視覺混亂,由于吸頂的標題會隨著滾動固定在頂部,可以讓用戶無需反復滑動回頂部確認分組位置&#xff…

使用Zotero的RSS訂閱功能快速了解感興趣領域最新文章

文章目錄 寫在前面中文期刊的RSS訂閱英文期刊的RSS訂閱回到Zotero有啥用? 寫在前面 作為一名研究生或者科研工作者,肯定需要經常檢索自己研究領域的最新文獻,相比于不定期的去各大數據庫檢索文獻,借助RSS訂閱功能則更加便捷。 R…

Windows安裝Docker Desktop開啟 Kubenetes制作并部署本地鏡像

1、安裝Docker Desktop docker desktop官方下載鏈接,下載后一路點下來安裝就好了。 2、制作本地鏡像 跟著docker步驟制作鏡像,需要先配置docker 鏡像源,因為網絡問題 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式學習筆記 - freeRTOS 列表,鏈表,節點跟任務之間關系

一 下圖說明了 freeRTOS 就緒列表,鏈表,節點跟任務之間關系 一個任務對應一個節點,一個鏈表對應一個優先級,一個任務根據優先級可以插入任何一個鏈表中。 插入函數為,這也是freeRTOS的核心函數,對每個任務…