Chromium多进程架构,你知道多少?

news2025/1/15 13:07:56

一、前言

国内外主流的浏览器,大多采用的是谷歌的Chromium 浏览器内核,Chromium是一个多进程多线程架构的Web引擎,很多应用和底层开发者希望了解Chromium中的进程和线程的种类和用途,以便能利用相关信息提升应用的性能。为此,本文介绍了Chromium的多进程架构演进历史,并详细列举了Chromium有哪些常见的进程和线程,并详细说明了它们的用途。希望通过此文能帮助读者初步了解Chromium有哪些常见的进程和线程,并详细说明了它们的用途。希望通过此文能帮助读者初步了解Chromium/Webview运行时的进程和线程情况。

二、Chromium进程架构演进史

单进程架构

9bebb97799017e98d0d3820465d08758.png

2007年前,市场上的浏览器基本上都是单进程架构,所有的功能模块都是运行在同一进程中。单一进程的架构有以下几个问题:

1. 稳定性

单进程的浏览器中,任一模块出现问题都会导致整个浏览器的崩溃。特别是早期浏览器的很多功能需要通过插件来实现,而三方实现的插件又特别容易出问题。类似的,过于复杂或者性能低下的JavaScript代码也容易导致JavaScript引擎崩溃,从而导致整个浏览器崩溃。

2. 性能

由于所有的网页都在一个进程中运行,某个网页JavaScript代码运行的很慢或者存在死循环,将会导致整个浏览器卡顿或者失去响应。并且由于渲染引擎可能存在的内存泄露问题,长时间运行的浏览器会占用越来越多的内存。 

3. 安全

单进程架构浏览器中所有的组件都运行在一个进程,很难实现合理的安全环境。插件和JavaScript脚本可以利用漏洞获取系统资源权限,导致很多安全性问题。

三、多进程架构

f7324991111687f16a1b59771f3bcace.png

2008年,Chromium (Chromium是Chrome的开源实现,两者的主要代码是一样的,Chrome相较于Chromium多了一些Google的私有组件。后续无特殊说明,Chromium等同Chrome)发布了如上图的多进程架构。与单进程架构的差别在于独立出了Renderer和Plugin进程。不同的进程间需要通过IPC来通信。Renderer进程即渲染引擎,主要负责页面渲染,包括HTML解析,渲染,JavaScript的执行等工作。

该架构有效的解决了单进程架构的三大问题:

1. 稳定性

各进程是隔离的。单个页面的组件崩溃只影响它所在的Renderer进程,不会导致整个浏览器崩溃,有效的解决了稳定性问题。

2. 性能

浏览器的每个tab都运行在独立的Renderer进程。存在死循环的JavaScript脚本只会影响当前tab,其他页面仍可正常运行。并且渲染引擎的内存泄露也只影响单独的进程,关闭使用内存过多的Renderer即可释放内存,不会影响其他网页的使用。

3. 安全

多进程的架构还引入了Sandbox沙盒机制,Renderer进程和插件进程运行在沙盒中。这些进程无法获取系统资源,资源的获取访问需要通过IPC由Browser进程执行,恶意脚本无法突破沙盒的限制从而影响到系统的安全。

ed3d257aa0eaadf77d66b71d0889af99.png

经过多年的发展,Chromium越来越多的功能被分离为独立的进程,例如GPU进程,网络进程。多进程虽然解决了稳定性,性能,安全性问题。但是过多的进程也存在内存占用过多和进程间通信导致的系统架构复杂度上升等问题。为了解决这些问题,Chromium在2016年提出了以SOA(Services Oriented Architecture)为基础的高内聚,低耦合,易扩展的架构。该架构期望将功能组件以服务的形式拆分或聚合,服务可以运行在独立的进程中也可以合并到单一进程。在高端设备上,服务可能会运行在独立的进程以增强稳定性和性能。在低端设备上,多个服务可以合并为单一进程以节省内存的使用。

四、Chromium的进程和线程

进程

Chromium的进程模型支持一到多个进程。通常的配置有Browser进程,Renderer进程,GPU进程,网络进程及多个服务进程。在资源较少的设备上可配置为双进程(Browser进程,Renderer进程)或单进程(Browser进程)。需要注意的是,单进程模式的代码没有经过Chromium官方的测试验证,如果要在产品中使用该模式,需要更多的工作维护单进程的稳定性。chrome_string_lookup.cc文件中可以查看到Chromium所有可能的进程和线程名。下图是Windows上打开两个tab时可见的进程:

73990b21a37be9749ca6830aa7a30942.png

1.Browser/UI进程

Web引擎的主进程,具有访问系统资源的权限。Windows中显示为浏览器进程,Android上通常就是App的进程。因为主进程中通常也负责和窗口系统的交互,所以有时也被称为UI进程。早期的时候主进程负责UI交互,持久化数据访问,网络资源下载。最新的Chromium中持久化数据访问,网络资源已作为独立的进程存在。

2.Renderer进程

渲染进程,该进程负责页面的渲染和JavaScript脚本的执行。根据配置的不同,能存在多个Renderer进程。简单来说打开的每个网页可能会创建一个renderer进程,但在资源较少的情况下,可以配置域相同的网页共享一个进程,甚至只有一个renderer进程。

Renderer进程是运行在Sandbox中的,该进程没有访问系统资源的权限,所有对资源的访问需求都通过IPC委托给其他功能进程,如网络进程,GPU进程。

3.GPU进程

执行GPU命令的进程,即实际调用opengl es接口的进程。Renderer进程是不能访问GPU的,他对GPU的操作需要通过CommandBuffer委托给GPU进程执行。可以配置不使用独立的GPU进程,这时该进程退化为一个线程运行在主进程中。

4.Network Service进程

执行资源加载的进程,文档资源通过该进程下载并通过Share Memory发送给Renderer进程解析。同样的该进程可配置为主进程中的一个线程。

5.Storage Service进程

为local/session storage, service worker, indexed_db提供存储服务。

6.Data Decoder Service进程

解码进程,执行image,zip等文件的解码。

7.Audio Service进程

音频进程,处理音频文件。

8.Zygote进程

功能和Android的zygote一样,用于加速Renderer进程的创建。

五、线程

Chromium的架构设计最大化的利用了现代处理的的多核架构,各进程中存在很多线程,每个线程负责特定的任务执行,Chromium常见的线程为以下几类:

1.线程池相关线程,各进程都会存在的线程,进程中可见多个同名的ThreadPool线程。

69a1162dd2938ead794c0a3b4bcd891f.png

2.IO相关线程,负责文件的访问,进程间的通信等工作。Browser进程的IO线程为Chrome_IOThread,其他进程的IO线程为Chrome_ChildIOThread。

3.Browser进程中的线程

a4aab30f88bb2826b77b26bddfdf962a.png

4.Renderer进程中的线程

1969d7c1dc0e5685219bdb9939858fc5.png

5.GPU进程中的线程

3db93da2cba62344478ae1f3f4664966.png

六、Android Webview的进程

Android 系统Webivew是谷歌为Android 提供的 Webivew组件。Android 系统Webivew基于Chromium代码(4.4版本之后),由于嵌入式平台的硬件差异,Android 系统Webivew的进程配置和PC上的Chromium有所不同。

七、Android系统Webview的进程

Android 系统Webivew的进程架构遵循Chromium的架构。但是由于平台的限制,在Android L, M, 和N 上,Webivew为单进程模式。在 Android O及之后设备上,Webivew为多进程模式。为了节省内存,多进程模式的Webivew也只有Browser和Renderer进程,GPU和网络服务都以线程的方式运行在Browser进程中,并且renderer进程也只有一个。

Android N 中Webivew可以通过全局配置获取进程模式。也可通过开发者菜单设置使用多进程模式(厂商的开发者菜单中不一定有此选项)。

Android O及之后的版本,Webivew默认为多进程模式,用户无法修改。虽然框架的代码中仍有进程配置相关的代码,但是App无法通过Webivew接口或manifest配置。

八、三方Webview

国内大厂通常会根据自己的需求基于Chromium引擎开发定制化的Webview,进程配置和Android系统Webview有所不同。开发者可以通过App各子进程中的关键线程名判断该进程属于Chromium的哪个子进程,例如拥有CrRendererMain线程的进程通常是renderer进程。

下面是一些常见应用中的进程,定制化的Webview通常会使用GPU进程以提高性能。

88bded697f83fa3f4328c3322780262a.png

九、小结

Chromium的进程架构目前已演进到面向服务的多进程架构,随着硬件设备的发展,未来可能会有更多的服务进程,充分的利用硬件资源。对于资源受限的设备,Chromium的进程架构也能方便的进行配置调整以减少资源使用。Web引擎开发者可以根据实际的场景来调整进程配置,应用和底层开发者也可根据实际的进程配置情况来选择应用或者内核的优化策略。

参考文献

1.https://ithelp.ithome.com.tw/articles/10270187

2.https://www.chromium.org/developers/design-documents/multi-process-architecture

3.https://keyou.github.io/blog/2020/01/03/Chromium-Mojo&IPC

4.https://www.chromium.org/developers/design-documents/inter-process-communication/

5.https://chromium.googlesource.com/chromium/src.git/+/51.0.2704.48/docs/mojo_in_chromium.md

6.https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/architecture.md

7.https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/renderer/README.md

436ed4b2d858b2be3d04415c36eba1cf.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章| 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++【一棵红黑树封装 set 和 map】

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 🌇前言🏙️正文1、红黑树的完善1.1、修改默认成员函数1.1.1、默认构造1.1.2、析构 ---> …

nodejs 跳蚤市场网站-计算机毕设 附源码83381

nodejs 跳蚤市场网站 目 录 摘要 1 绪论 1.1选题背景与意义 1.2国内外发展情况 1.3node.js主要功能 1.4node.js功能模块 1.5论文结构与章节安排 2跳蚤市场网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 …

django公交线路查询系统-计算机毕设 附源码85021

django公交线路查询系统 摘 要 本论文主要论述了如何使用django框架开发一个公交线路查询系统,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述该系统的当前背景以及系统开发的目的&…

售后商品破损回复话术

想必客服们最关注且最头疼的问题便是售后问题了吧,特别是一些商品破损类的问题,是客服们最不想面对的问题之一了,为此小编整理了一份商品破损回复话术提供给大家,希望能对大家有所帮助哦~ 一、询问与核实 1.对不起,由…

Linux系统编程:进程的状态和进程优先级

目录 一. Linux操作系统进程的状态 二. 进程状态的标识 2.1 运行状态R 2.2 睡眠状态S 2.3 前台进程和后台进程 2.4 磁盘睡眠状态D 2.5 暂停状态和调试状态T 2.6 僵尸状态Z 2.7 终止状态X 2.8 孤儿进程 三. 进程优先级 3.1 什么是优先级 3.2 进程优先级的修改和进…

一文带你了解Java的I O机制

Java I/O 一:故事背景二:什么是Java的I\O机制2.1 流2.1.2 字节流和字符流的区别2.1.3 输入流和输出流的区别 2.2 文件 I/O2.3 缓冲 I/O2.4 标准 输入/输出2.5 对象序列化与反序列化2.6 N I/O 三:画图表示Java I/O机制3.1 输入输入系统流程示意…

vue中响应式的数组方法

vue响应式的数组方法 1、push 在数组中追加元素 <div id"app"><ul><li v-for"item in arr">{{item}}</li></ul><button click "change">按钮</button> </div> <script src"js/vue.js&…

普通单目相机标定——准备工作

前言 这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。 已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。 1)由世…

Linux基础_1

目录 一、用户登录 1、root用户 2、普通&#xff08;非特权&#xff09;用户 二、终端terminal 1、终端类型 2、查看当前的终端设备 三、交互式接口 1、概念&#xff1a;启动终端后&#xff0c;在终端设备附加一个交互式应用程序 2、类型 3、什么是Shell 4、各种She…

Python源码:用turtle画美国队长盾牌

解析&#xff1a; 美国队长盾牌结构分析&#xff1a; 有4个圆和一个五角星组成。 源码如下&#xff1a; import turtle as t #控制画笔的速度 t.speed(10) #画最外面的大圆 t.penup() t.goto(100,-235) t.pendown() t.color("red","red") t.begin_fill(…

iOS 实现多scheme 切换环境完整流程

文章目录 一、 添加configuration二、 添加scheme三、 设置scheme 和 configuration的对应关系四 、 本地配置文件五、 运行 前言 我们在开发中都要涉及到切换环境&#xff0c;很多小伙伴是通过宏定义的方式实现 切换环境的 &#xff0c; 这种方式不优雅&#xff0c;还可造成每…

MySQL基础篇(day02,复习自用)

MySQL第二天 基本的SELECT语句大小规范注释命名规则数据导入指令select语句练习 运算符代码练习 基本的SELECT语句 SQL 可以写在一行或者多行。为了提高可读性&#xff0c;各子句分行写&#xff0c;必要时使用缩进 每条命令以 ; 或 \g 或 \G 结束 关键字不能被缩写也不能分行 关…

中国开源,迈入“新生代”

提到中国开源&#xff0c;大家会想到什么&#xff1f; “追随者&#xff0c;而不是创造者”“国外一开源&#xff0c;国內就自主”“全球开源社区里的nobody”……如果你带着这些“刻板印象”&#xff0c;参加近两年国內的开源活动&#xff0c;极大可能会受到不小的震撼。 中国…

cglib动态代理 | 如何生成代理类、代理类内容解析

文章目录 简介一、cglib动态代理有什么特点CgLib动态代理&#xff1a;优点&#xff1a;缺点&#xff1a; 二、Cglib如何生成代理类生成代理类的具体代码&#xff1a;生成代理对象的具体代码&#xff1a; 三、代理类内容解析持久化代理类&#xff1a;代理类内容&#xff1a; Cgl…

数据指标体系建设

一、什么是数据指标体系&#xff1f; 指标体系是从不同维度梳理业务&#xff0c;把指标有系统的组织起来。简而言之&#xff0c;指标体系指标体系&#xff0c;所以一个指标不能叫指标体系&#xff0c;几个毫无关系的指标也不叫指标体系。指标体系就像是一个整体、一辆车&#…

MacOS Sonoma 14.0 (23A5276g) Beta2 带 OC 引导双分区黑苹果镜像

苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta2 更新&#xff08;内部版本号&#xff1a;23A5276g&#xff09;&#xff0c;本次更新距离上次发布隔了 15 天。 镜像下载&#xff1a; 微信公众号&#xff1a; macOS Sonoma 14.0 (23A5276g) Beta2 带 OC 引导双分…

【人工智能】— 深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化

【人工智能】— 深度神经网络、卷积神经网络&#xff08;CNN&#xff09;、多卷积核、全连接、池化 深度神经网络训练训练深度神经网络参数共享 卷积神经网络&#xff08;CNN&#xff09;卷积多卷积核卷积全连接最大池化卷积池化拉平向量激活函数优化小结 深度神经网络训练 Pr…

罗大佑、把午睡打造成领域驱动设计创新-UMLChina建模知识竞赛第4赛季第6轮

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者的判定&am…

最优化系列 之 线性规划问题的灵敏度分析(1/6)

一、实验目的&#xff1a; 1. 掌握用MATLAB、LINGO 、EXCEL优化工具箱解线性规划的方法&#xff1b; 2. 练习建立实际问题的线性规划模型&#xff1b; 3. 掌握线性规划灵敏度分析原理&#xff1b; 4. 预习线性规划的灵敏度分析原理及方法。 二、实验内容 题目1&#xff1a;求解…

【spring cloud学习】2、Eureka服务注册与发现

前言 一套微服务架构的系统由很多单一职责的服务单元组成&#xff0c;而每个服务单元又有众多运行实例。由于各服务单元颗粒度较小、数量众多&#xff0c;相互之间呈现网状依赖关系&#xff0c;因此需要服务注册中心来统一管理微服务实例&#xff0c;维护各服务实例的健康状态…