聊一聊Electron中Chromium多進程架構

Chromium 多進程架構概述

Chromium 的多進程架構是其核心設計之一,旨在提高瀏覽器的穩定性、安全性和性能。Chromium 將不同的功能模塊分配到獨立的進程中,每個進程相互隔離,避免了單進程架構中一個模塊的崩潰導致整個瀏覽器崩潰的問題。

在 Chromium 的多進程架構中,主要包含以下幾種進程類型:

  • Browser Process:瀏覽器主進程,負責管理所有其他進程,處理用戶界面、網絡請求、文件訪問等全局任務。
  • Renderer Process:渲染進程,負責網頁的渲染和 JavaScript 執行,每個標簽頁通常對應一個獨立的渲染進程。
  • GPU Process:GPU 進程,負責處理與圖形渲染相關的任務,如 WebGL、CSS 動畫等。
  • Plugin Process:插件進程,負責運行瀏覽器插件,如 Flash 等。
  • Utility Process:工具進程,用于處理一些輔助任務,如網絡服務、文件解碼等。

Chromium 源碼剖析

Chromium 的源碼結構復雜,但其多進程架構的核心代碼主要集中在 content 模塊中。以下是對 Chromium 源碼中多進程架構的關鍵部分進行剖析。

Browser Process

Browser Process 是 Chromium 的主進程,負責管理所有其他進程。其核心代碼位于 content/browser 目錄下。BrowserMainLoop 類是 Browser Process 的入口,負責初始化瀏覽器并啟動主事件循環。

// content/browser/browser_main_loop.cc
int BrowserMainLoop::Initialize() {// 初始化瀏覽器主循環...return 0;
}

Renderer Process

Renderer Process 負責網頁的渲染和 JavaScript 執行。其核心代碼位于 content/renderer 目錄下。RenderProcess 類是 Renderer Process 的入口,負責初始化渲染進程并啟動渲染線程。

// content/renderer/render_process.cc
void RenderProcess::Initialize() {// 初始化渲染進程...
}

進程間通信

Chromium 使用 Mojo 框架進行進程間通信。Mojo 是一個跨進程通信框架,允許不同進程之間通過消息傳遞進行交互。Mojo 的核心代碼位于 mojo 目錄下。

// mojo/public/cpp/bindings/binding.h
class Binding {public:// 綁定消息接收器...
};

Electron 中的多進程架構

Electron 是基于 Chromium 和 Node.js 構建的框架,允許開發者使用 Web 技術構建跨平臺桌面應用。Electron 繼承了 Chromium 的多進程架構,并在此基礎上進行了擴展。

Main Process

在 Electron 中,Main Process 相當于 Chromium 的 Browser Process,負責管理應用的主窗口和所有其他進程。Main Process 的代碼通常位于 main.js 文件中。

// main.js
const { app, BrowserWindow } = require('electron');app.on('ready', () => {const mainWindow = new BrowserWindow({ width: 800, height: 600 });mainWindow.loadURL('https://example.com');
});

Renderer Process

在 Electron 中,Renderer Process 負責渲染網頁內容,并可以訪問 Node.js API。每個窗口通常對應一個獨立的 Renderer Process。Renderer Process 的代碼通常位于 renderer.js 文件中。

// renderer.js
const { ipcRenderer } = require('electron');ipcRenderer.send('message', 'Hello from Renderer Process');

進程間通信

Electron 提供了 ipcMainipcRenderer 模塊,用于 Main Process 和 Renderer Process 之間的通信。ipcMain 用于在 Main Process 中接收消息,ipcRenderer 用于在 Renderer Process 中發送消息。

// main.js
const { ipcMain } = require('electron');ipcMain.on('message', (event, arg) => {console.log(arg); // 輸出: Hello from Renderer Process
});

Electron 源碼剖析

Electron 的源碼結構相對復雜,但其多進程架構的核心代碼主要集中在 libatom 目錄下。以下是對 Electron 源碼中多進程架構的關鍵部分進行剖析。

Main Process 初始化

Electron 的 Main Process 初始化代碼位于 lib/browser/init.js 文件中。app 模塊負責初始化應用并啟動主事件循環。

// lib/browser/init.js
app.on('ready', () => {// 應用初始化完成...
});

Renderer Process 初始化

Electron 的 Renderer Process 初始化代碼位于 lib/renderer/init.js 文件中。BrowserWindow 模塊負責創建和管理窗口。

// lib/renderer/init.js
const { BrowserWindow } = require('electron');const win = new BrowserWindow({ width: 800, height: 600 });
win.loadURL('https://example.com');

進程間通信實現

Electron 的進程間通信實現代碼位于 lib/renderer/api/ipc-renderer.jslib/browser/api/ipc-main.js 文件中。ipcRendereripcMain 模塊分別負責在 Renderer Process 和 Main Process 中處理消息。

// lib/renderer/api/ipc-renderer.js
ipcRenderer.send('message', 'Hello from Renderer Process');// lib/browser/api/ipc-main.js
ipcMain.on('message', (event, arg) => {console.log(arg); // 輸出: Hello from Renderer Process
});

總結

Chromium 的多進程架構通過將不同功能模塊分配到獨立的進程中,提高了瀏覽器的穩定性、安全性和性能。Electron 繼承了 Chromium 的多進程架構,并在此基礎上進行了擴展,允許開發者使用 Web 技術構建跨平臺桌面應用。通過剖析 Chromium 和 Electron 的源碼,可以更深入地理解其多進程架構的實現原理。

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

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

相關文章

CodeBuddy 中國版 Cursor 實戰:Redis+MySQL雙引擎驅動〈王者榮耀〉戰區排行榜

文章目錄 一、引言二、系統架構設計2.1、整體架構概覽2.2、數據庫設計2.3、后端服務設計 三、實戰:從零構建排行榜3.1、開發環境準備3.2、用戶與戰區 數據管理3.2.1、MySQL 數據庫表創建3.2.2、實現用戶和戰區數據的 CURD 操作 3.3、實時分數更新3.4、排行榜查詢3.5…

Oracle OCP認證考試考點詳解083系列15

題記: 本系列主要講解Oracle OCP認證考試考點(題目),適用于19C/21C,跟著學OCP考試必過。 71. 第71題: 題目 解析及答案: 關于在 Oracle 18c 及更高版本中基于 Oracle 黃金鏡像的安裝,以下哪…

LS-NET-012-TCP的交互過程詳解

LS-NET-012-TCP的交互過程詳解 附加:TCP如何保障數據傳輸 TCP的交互過程詳解 一、TCP協議核心交互流程 TCP協議通過三次握手建立連接、數據傳輸、四次揮手終止連接三大階段實現可靠傳輸。整個過程通過序列號、確認應答、窗口控制等機制保障傳輸可靠性。 1.1 三次…

【Pandas】pandas DataFrame cumprod

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每個元素的絕對值DataFrame.all([axis, bool_only, skipna])用于判斷 DataFrame 中是否所有元素在指定軸上都為 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判斷…

C語言之旅5---分支與循環【2】

💫只有認知的突破💫才來帶來真正的成長💫編程技術的學習💫沒有捷徑💫一起加油💫 🍁感謝各位的觀看🍁歡迎大家留言🍁咱們一起加油🍁努力成為更好的自己&#x…

docker大鏡像優化實戰

在 Docker 鏡像優化方面,有許多實戰技巧可以顯著減小鏡像體積、提高構建效率和運行時性能。以下是一些實用的優化策略和具體操作方法: 1. 選擇合適的基礎鏡像 策略 使用 Alpine 版本:Alpine 鏡像通常只有 5-10MB,比 Ubuntu/Deb…

Java面試終極篇:Sentinel+Seata+Kafka Streams高并發架構實戰

面試官:張總(嚴肅臉) 程序員:小王(緊張冒冷汗) 第一輪:分布式基礎 張總:說說Spring Cloud Alibaba的Sentinel和Nacos的區別? 小王:(結巴&#…

hab機制

HAB(Host-to-Guest Communication)?是一種用于高通平臺上的主機與虛擬機之間的通信機制,主要用于實現宿主操作系統(host OS)與虛擬機操作系統(guest OS)之間的數據共享和通信。HAB機制允許虛擬…

Mac M系列 安裝 jadx-gui

安裝 Homebrew在終端中執行以下命令(需管理員密碼): 安裝 Homebrew(官方源) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"國內用戶可用鏡像源加速&…

Angular | 利用 `ChangeDetectorRef` 解決 Angular 動態顯示輸入框的聚焦問題

在 Angular 應用開發中,實現用戶點擊按鈕后,原地切換顯示一個輸入框并自動獲取焦點的功能,是一個常見的交互模式。例如,搜索圖標點擊后變為搜索框,用戶可以直接輸入。然而,由于 Angular 的變更檢測和 DOM 更…

CSP認證準備第三天-差分及第36次CCF認證(BFS)

基礎知識參考: csp突擊前兩題常用算法代碼_ccf csp常用優化算法-CSDN博客 差分 什么是差分數組? 差分數組是原數組相鄰元素之間的差值構成的數組。對于原數組 a,其差分數組 b 定義為: b[1] a[1] (假設 a[0] 0) b[i] a[i] …

[案例四] 智能填寫屬性工具(支持裝配組件還有建模實體屬性的批量創建、編輯)

論文盲審結果要出來了,渣渣超沒有心情繼續寫了,過一段時間再說吧,今天宣布五一結束,哈哈哈。寫完這篇博客開始搞科研了,有時間再進NX開發學習。本次案例主要是對上次導出自動導出BOM的一個前處理,要想導出屬性,首先的有屬性。于是本著學習的態度進行制作,可能有些功能有…

四核RK3566多媒體控制板技術分享(RK3566如何實現7個串口同時進行)

四核RK3566多媒體控制板技術分享: 今天分享一款近期接觸到的四核RK3566多媒體控制板(產品型號:ZK-R36A),這款產品在工業控制和智能設備領域有不錯的表現,特此整理了一些技術參數供大家參考。 產品概述: 這款控制板采用…

多線程代碼案例-1 單例模式

單例模式 單例模式是開發中常見的設計模式。 設計模式,是我們在編寫代碼時候的一種軟性的規定,也就是說,我們遵守了設計模式,代碼的下限就有了一定的保證。設計模式有很多種,在不同的語言中,也有不同的設計…

【計算機組成原理】第二部分 存儲器--分類、層次結構

文章目錄 分類&層次結構0x01 分類按存儲介質分類按存取方式分類按在計算機中的作用分類 0x02 層次結構 分類&層次結構 0x01 分類 按存儲介質分類 半導體存儲器磁表面存儲器磁芯存儲器光盤存儲器 按存取方式分類 存取時間與物理地址無關(隨機訪問&#…

迅為RK3588開發板安卓GPIO調用APP運行測試

將網盤上的安卓工程文件復制到 Windows 電腦上。確保工程路徑中使用英文字符,不包含中文。接著,啟動 Android Studio,點擊“Open”按鈕選擇應用工程文件夾,然后點擊“OK”。由于下載 Gradle 和各種 Jar 包可能需要一段時間&#x…

BFS算法篇——打開智慧之門,BFS算法在拓撲排序中的詩意探索(下)

文章目錄 引言一、課程表1.1 題目鏈接:https://leetcode.cn/problems/course-schedule/description/1.2 題目分析:1.3 思路講解:1.4 代碼實現: 二、課程表||2.1 題目鏈接:https://leetcode.cn/problems/course-schedul…

計數循環java

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int count 10;while(count > 0) {count count -1;System.out.println(count);}System.out.println(count);System.out.println("發射&am…

11. CSS從基礎樣式到盒模型與形狀繪制

在前端開發中,CSS(層疊樣式表)是控制網頁樣式和布局的核心技術。整理了關于 CSS 基礎樣式、文本樣式、盒模型以及形狀繪制的一些心得。以下是詳細的學習筆記。 一、基礎樣式設置 1. 字體樣式 字體樣式是網頁視覺呈現的重要組成部分&#xf…

雙種群進化算法:動態約束處理與資源分配解決約束多目標優化問題

雙種群進化算法:動態約束處理與資源分配解決約束多目標優化問題 一、引言 約束多目標優化問題(CMOPs)在工程設計、資源分配等領域廣泛存在,其核心是在滿足多個約束條件的同時優化多個目標函數。傳統方法往往難以平衡約束滿足與目…