勇闯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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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的核心函数,对每个任务…