当前位置: 首页 > article >正文

Chromium 浏览器核心生命周期剖析:从 BrowserProcess 全局管理到 Browser 窗口实例

在 Chromium 浏览器架构中,BrowserProcess 和 Browser 是两个核心类,分别管理 浏览器进程的全局状态 和 单个浏览器窗口的实例。它们的生命周期设计直接影响浏览器的稳定性和资源管理。以下是它们的详细生命周期分析:


1. BrowserProcess 的生命周期

角色

BrowserProcess 是浏览器进程(Browser Process)的单例全局管理器,负责维护跨所有浏览器窗口共享的资源和子系统(如网络、缓存、策略服务等)。

生命周期阶段
  1. 初始化阶段

    • 创建时机:在浏览器进程启动时(BrowserMainLoop 初始化期间)通过 BrowserMainRunnerImpl::Initialize 创建。

    • 关键操作

      // chrome/browser/browser_process_impl.cc
      BrowserProcessImpl::BrowserProcessImpl(): created_browser_process_(true) {// 初始化全局服务(如资源管理器、策略服务)local_state_ = CreateLocalState();network_service_instance_ = std::make_unique<NetworkServiceInstance>();
      }
  2. 运行阶段

    • 持有多个关键子系统的单例:

      • ResourceCoordinatorService(资源协调)

      • MetricsService(指标统计)

      • ProfileManager(用户配置管理)

    • 跨进程通信枢纽:通过 Mojo 接口与其他进程(Renderer、GPU等)交互。

  3. 销毁阶段

    • 销毁时机:在浏览器进程退出时(BrowserMainLoop::ShutdownThreadsAndCleanUp)销毁。

    • 关键操作

      BrowserProcessImpl::~BrowserProcessImpl() {// 按依赖顺序销毁子系统(如先销毁 ProfileManager,再销毁网络服务)profile_manager_.reset();network_service_instance_.reset();
      }
生命周期特点
  • 单例模式:通过 g_browser_process 全局指针访问(base::NoDestructor 保证线程安全)。

  • 长生命周期:贯穿整个浏览器进程运行期间。

  • 强依赖关系Browser 实例依赖 BrowserProcess 的子系统(如 Profile)。


2. Browser 的生命周期

角色

Browser 类代表单个浏览器窗口实例(如一个 Chrome 窗口),管理其标签页(TabStripModel)、地址栏、工具栏等 UI 组件。

生命周期阶段
  1. 创建阶段

    • 触发条件:用户点击“新建窗口”或通过命令行启动新窗口。

    • 关键代码

      // chrome/browser/ui/browser.cc
      Browser::Browser(const CreateParams& params): profile_(params.profile),tab_strip_model_(std::make_unique<TabStripModel>(...)) {// 初始化窗口UI组件window_ = views::Widget::CreateWindowWithContext(...);
      }
  2. 运行阶段

    • 标签页管理:通过 TabStripModel 动态添加/删除标签页。

    • 事件响应:处理用户输入(如导航、书签操作)。

    • 依赖关系

      • 从 BrowserProcess 获取全局服务(如 HistoryService)。

      • 通过 WebContents 与渲染进程(Renderer Process)交互。

  3. 销毁阶段

    • 触发条件:用户关闭窗口或程序退出。

    • 关键操作

      Browser::~Browser() {// 释放标签页资源tab_strip_model_->CloseAllTabs();// 通知观察者(如扩展系统)for (auto& observer : observers_)observer.OnBrowserDestroyed(this);
      }
生命周期特点
  • 多实例共存:每个窗口对应一个 Browser 对象。

  • 短生命周期:随窗口打开/关闭动态创建和销毁。

  • 依赖 Profile:每个 Browser 绑定到一个 Profile(用户配置)。


3. 关键交互与依赖关系

(1) BrowserProcess 对 Browser 的影响
  • 资源共享:所有 Browser 实例共享 BrowserProcess 的全局服务(如 PrefService)。

  • 销毁顺序BrowserProcess 必须在所有 Browser 销毁后释放(否则会导致依赖的服务提前失效)。

(2) Browser 的跨进程依赖
  • 渲染进程:通过 WebContents 管理多个 RenderFrameHost

  • GPU进程:窗口渲染依赖 viz::Compositor


4. 生命周期图示


5. 常见问题与解决方案

问题1:Browser 销毁时资源泄漏
  • 原因:未正确释放 WebContents 或监听器。

  • 解决:在 Browser::~Browser() 中确保调用 tab_strip_model_->CloseAllTabs()

问题2:BrowserProcess 子系统的线程安全问题
  • 原因ProfileManager 可能被多线程访问。

  • 解决:通过 base::SequenceChecker 强制单线程访问。

问题3:浏览器崩溃时生命周期中断
  • 解决:依赖 Crashpad 捕获崩溃,并在重启后恢复 Profile 状态。


6. 总结

生命周期范围关键依赖线程模型
BrowserProcess浏览器进程运行期间全局服务(如 NetworkService主线程(UI线程)
Browser单个窗口打开期间ProfileTabStripModel主线程(UI线程)
  • 设计原则

    • BrowserProcess 是稳定的基础设施,生命周期最长。

    • Browser 是动态资源消费者,需严格管理依赖关系。

    • 通过 Mojo 和 Profile 解耦进程间依赖。

相关文章:

Chromium 浏览器核心生命周期剖析:从 BrowserProcess 全局管理到 Browser 窗口实例

在 Chromium 浏览器架构中&#xff0c;BrowserProcess 和 Browser 是两个核心类&#xff0c;分别管理 浏览器进程的全局状态 和 单个浏览器窗口的实例。它们的生命周期设计直接影响浏览器的稳定性和资源管理。以下是它们的详细生命周期分析&#xff1a; 1. BrowserProcess 的生…...

易境通海外仓系统:一件代发全场景数字化解决方案

随着全球经济一体化和消费升级&#xff0c;一件代发业务的跨境电商市场规模持续增长。然而&#xff0c;一件代发的跨境运营也面临挑战&#xff0c;传统海外仓管理模式更因效率低下、协同困难成为业务扩张的瓶颈。 一、一件代发跨境运营痛点 1、多平台协同&#xff1a;卖家往往…...

Flink 非确定有限自动机NFA

Flink 是一个用于状态化计算的分布式流处理框架&#xff0c;而非确定有限自动机&#xff08;NFA, Non-deterministic Finite Automaton&#xff09;是一种在计算机科学中广泛使用的抽象计算模型&#xff0c;常用于正则表达式匹配、模式识别等领域。 Apache Flink 提供了对 NFA…...

YoloV9改进策略:卷积篇|风车卷积|即插即用

论文信息 论文标题:《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 论文链接:https://arxiv.org/pdf/2412.16986 GitHub链接:https://github.com/JN-Yang/PConv-SDloss-Data 论文翻译 摘要 https://arxiv.org/pd…...

【Python训练营打卡】day30 @浙大疏锦行

DAY 30 模块和库的导入 知识点回顾&#xff1a; 1. 导入官方库的三种手段 2. 导入自定义库/模块的方式 3. 导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何…...

超越想象:利用MetaGPT打造高效的AI协作环境

前言 在人工智能迅速发展的今天&#xff0c;如何让多个大语言模型&#xff08;LLM&#xff09;高效协同工作成为关键挑战。MetaGPT 作为一种创新的多智能体框架&#xff0c;成功模拟了一个真实软件公司的运作流程&#xff0c;实现了从需求分析到代码实现的全流程自动化&#x…...

仿腾讯会议——添加音频

1、实现开启或关闭音频 2、 定义信号 3、实现开始暂停音频 4、实现信号槽连接 5、回收资源 6、初始化音频视频 7、 完成为每个人创建播放音频的对象 8、发送音频 使用的是对象ba&#xff0c;这样跨线程不会立刻回收&#xff0c;如果使用引用&#xff0c;跨线程会被直接回收掉&a…...

虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系

虚幻引擎5-Unreal Engine笔记之GameMode、关卡&#xff08;Level&#xff09; 和 关卡蓝图&#xff08;Level Blueprint&#xff09;的关系 code review! 参考笔记&#xff1a; 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡&#xff08;Level&#xff09; 和 关卡蓝图&…...

vue3 vite 项目中自动导入图片

vue3 vite 项目中自动导入图片 安装插件配置插件使用方法 安装插件 yarn add vite-plugin-vue-images -D 或者 npm install vite-plugin-vue-images -D配置插件 在 vite.config.js 文件中配置插件 // 引入 import ViteImages from vite-plugin-vue-images;plugins: [vue(),/…...

MTK zephyr平台:系统休眠流程

一、概述: 当内核没有需要调度的东西时,就会进入空闲状态。 CONFIG_PM=y时允许内核调用PM subsys,将空闲系统置于支持的电源状态之一。 Application负责设置唤醒事件,该事件通常是由SoC外围模块触发的中断,例如: SysTick、RTC、计数器、GPIO 并非所有外设在所有电源模式…...

涨薪技术|0到1学会性能测试第71课-T-SQL调优

前面的推文我们掌握了索引调优技术,今天给大家分享T-SQL调优技术。后续文章都会系统分享干货,带大家从0到1学会性能测试。 对T-SQL语句进行调校是DBA调优数据库性能的主要任务,因为不同的查询语句,即使查询出来的结果一致,其消耗的时间和系统资源也有所不同,所以如何使查…...

Spark SQL 之 Antlr grammar 具体分析

src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseLexer.g4 BACKQUOTED_IDENTIFIER: ` ( ~` | `` )* `;src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBaseParser.g4 queryPrimary:...

Python----目标检测(PASCAL VOC数据集)

一、PASCAL VOC数据集 PASCAL VOC&#xff08;Visual Object Classes&#xff09;数据集是计算机视觉领域中广泛使用的一个 标准数据集&#xff0c;用于目标检测、图像分割、图像分类、动作识别等任务。该数据集由 PASCAL&#xff08;Pattern Analysis, Statistical Modelling …...

LabVIEW汽车CAN总线检测系统开发

CAN&#xff08;ControllerArea Network&#xff09;总线作为汽车电子系统的核心通信协议&#xff0c;广泛应用于动力总成、车身控制、辅助驾驶等系统。基于 LabVIEW 开发 CAN 总线检测系统&#xff0c;可充分利用其图形化编程优势、丰富的硬件接口支持及强大的数据分析能力&am…...

MySQL数据库基础 -- SQL 语句的分类,存储引擎

目录 1. 什么是数据库 2. 基本使用 2.1 进入 mysql 2.2 服务器、数据库以及表的关系 2.3 使用案例 2.4 数据逻辑存储 3. SQL 语句分类 4. 存储引擎 4.1 查看存储引擎 4.2 存储引擎的对比 1. 什么是数据库 安装完 MySQL 之后&#xff0c;会有 mysql 和 mysqld。 MySQL …...

二元Logistic回归

二元Logistic回归 在机器学习领域&#xff0c;二元Logistic回归是一种非常经典的分类模型&#xff0c;广泛用于解决具有两类标签的分类问题。Logistic回归通过逻辑函数&#xff08;Sigmoid函数&#xff09;将预测结果映射到概率值&#xff0c;并进行分类。 一、Logistic回归 …...

如何从容应对面试?

引言 简历通过了&#xff0c;终于获得这次来之不易面试机会的你&#xff0c;是不是又在思考以下问题&#xff1a;基本礼仪都包括哪些方面&#xff1f;如何在群面中打动面试官&#xff1f;有什么注意事项&#xff1f;在面试的过程中&#xff0c;我们不单单要懂得面试技巧&#…...

如何使用GIT管理项目代码

介绍 ​ Git是目前世界上最流行甚至最好的开源分布式版本控制系统&#xff0c;不论是很小的项目还是很大的项目&#xff0c;它都能有效并且高效的处理项目版本管理&#xff0c;初衷是为了帮助管理linux内核代码而开发的一个开放源码的版本控制软件。 GIT常用分支名称 分支分…...

RHCE 练习三:架设一台 NFS 服务器

一、题目要求 1、开放 /nfs/shared 目录&#xff0c;供所有用户查询资料 2、开放 /nfs/upload 目录&#xff0c;为 192.168.xxx.0/24 网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…...

【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】

1. HCI_Read_Local_Supported_Commands 命令介绍 1. 命令介绍&#xff08;Description&#xff09; HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host&#xff08;如 Android 系统中的 Bluetooth stack&#xff09;获取 Controller&#xff08;…...

stm32实战项目:无刷驱动

目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频&#xff1a;RCC_Configuration()设置PLL外设时钟使能&#xff1a;TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…...

python打卡训练营打卡记录day30

一、导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库。 1.1标准导入&#xff1a;导入整个库 这是最基本也是最常见的导入方式&#xff0c;直接使用import语句。 # 方式1&#xff1a;导入整…...

2025年- H33-Lc141 --148. 排序链表(快慢指针,快指针先出发一步)--Java版

1.题目描述 2.思路 时间空间复杂度分别为 O(nlogn) 和 O(1)&#xff0c;根据时间复杂度想到二分法&#xff0c;从而联想到归并排序&#xff1b;对数组做归并排序的空间复杂度为 O(n)&#xff0c;分别由新开辟数组 O(n) 和递归函数调用 O(logn) 组成&#xff0c;而根据链表特性…...

【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…...

板凳-------Mysql cookbook学习 (四)

综合对比与选择建议 维度 PHP Java Python Ruby Perl 学习门槛 低&#xff08;适合新手&#xff09; 高&#xff08;语法复杂&#xff09; 低&#xff08;语法简洁&#xff09; 中&#xff08;需理解 Rails 理念&#xff09; 中&#xff08;特殊语法&#xf…...

【D1,2】 贪心算法刷题

文章目录 不同路径 II整数拆分 不同路径 II 初始化的时候不能整列初始化为1&#xff0c;因为如果有障碍物&#xff0c;后面的都不能到达 也不能整列初始化为0&#xff0c;因为状态转移的时候第一行第一列都没有检查&#xff0c;因此不能部分初始化 整数拆分 需要考虑几种情况…...

算法题(150):拼数

审题&#xff1a; 本题需要我们将数组中的数据经过排序&#xff0c;使得他们拼接后得到的数是所有拼接方案中最大的 思路&#xff1a; 方法一&#xff1a;排序贪心 贪心策略1&#xff1a;直接排序 如果我们直接按照数组数据的字典序进行排序&#xff0c;会导致部分情况出错 eg&…...

Denoising Score Matching with Langevin Dynamics

在自然图像等复杂数据集中&#xff0c;真实数据往往集中分布在一个低维流形上&#xff0c;概率密度函数的梯度&#xff08;即得分函数&#xff09;难以定义与估计。为缓解该问题&#xff0c;SMLD 提出使用不同强度的高斯噪声对数据进行扰动&#xff0c;扰动后的数据不再集中于低…...

Docker构建 Dify 应用定时任务助手

概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案&#xff0c;用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰&#xff0c;本工具可以帮助设置自动执行任务并获取实时通知&#xff0c;优化你的工作效率。 注意&…...

mongodb管理工具的使用

环境&#xff1a; 远程服务器的操作系统&#xff1a;centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的&#xff1a;通过本地的navicat链接mongoDB,如何打通链接&#xff0c;分2步&#xff1a; 第一步&#xff1a;宝塔-&…...