浏览器工作原理与实践
李兵
前盛大创新院高级研究员
56402 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
浏览器工作原理与实践
15
15
1.0x
00:00/00:00
登录|注册

01 | Chrome架构:仅仅打开了1个页面,为什么有4个进程?

在资源不足的设备上的服务合并
Chrome基础服务
插件进程
网络进程
GPU进程
渲染进程
浏览器进程
解决安全问题
解决内存泄漏的问题
解决不流畅的问题
解决不稳定的问题
不安全的问题
不流畅的问题
不稳定的问题
进程之间的内容相互隔离
进程关闭后的内存回收
线程之间共享进程中的数据
进程中的线程执行出错的影响
线程的依附关系
进程的概念
多线程的优势
Chrome浏览器的任务管理器
推动浏览器发展的主要动力
Chrome的进化速度
Chrome的架构重构
Chrome的进化史
Chrome的面向服务的架构
目前多进程架构
早期多进程架构
单进程浏览器的架构
线程 VS 进程
并行处理
Chrome浏览器的代表性
思考时间
总结
未来面向服务的架构
多进程浏览器时代
单进程浏览器时代
进程和线程
学习浏览器的多进程架构是很有必要的
Chrome浏览器进程架构

该思维导图由 AI 生成,仅供参考

无论你是想要设计高性能 Web 应用,还是要优化现有的 Web 应用,你都需要了解浏览器中的网络流程、页面渲染过程,JavaScript 执行流程,以及 Web 安全理论,而这些功能是分散在浏览器的各个功能组件中的,比较多、比较散,要怎样学习才能掌握呢?通过浏览器的多进程架构的学习,你就可以把这些分散的知识点串起来,组成一张网,从而让自己能站在更高的维度去理解 Web 应用。
因此,学习浏览器的多进程架构是很有必要的。需要说明的是,在本专栏中,我所有的分析都是基于 Chrome 浏览器的。那么多浏览器,为什么偏偏选择 Chrome 浏览器呢?因为 Chrome、微软的 Edge 以及国内的大部分主流浏览器,都是基于 Chromium 二次开发而来;而 Chrome 是 Google 的官方发行版,特性和 Chromium 基本一样,只存在一些产品层面差异;再加上 Chrome 是目前世界上使用率最高的浏览器,所以 Chrome 最具代表性
在开始之前,我们一起看下,Chrome 打开一个页面需要启动多少进程?你可以点击 Chrome 浏览器右上角的“选项”菜单,选择“更多工具”子菜单,点击“任务管理器”,这将打开 Chrome 的任务管理器的窗口,如下图:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Chrome浏览器的多进程架构是其突出特点之一。该架构的引入解决了单进程浏览器存在的稳定性、流畅性和安全性等问题。通过将页面和插件分别运行在单独的渲染进程和插件进程中,并通过IPC机制进行通信,Chrome成功解决了页面或插件崩溃导致整个浏览器崩溃的问题。同时,多进程架构还带来了安全沙箱的额外好处,保护系统免受恶意程序的侵害。然而,多进程模型也带来了一些问题,如更高的资源占用和更复杂的体系架构。为了解决这些问题,Chrome团队提出了“面向服务的架构”(SOA)的思想,将各种模块重构成独立的服务,每个服务在独立的进程中运行,通过IPC进行通信,构建更内聚、松耦合、易于维护和扩展的系统。Chrome正在逐步构建Chrome基础服务,将现代操作系统的“面向服务的架构”引入浏览器架构,以实现简单、稳定、高速、安全的目标。总的来说,Chrome浏览器的多进程架构在提升稳定性、流畅性和安全性的同时,也面临着资源占用和体系架构复杂性的挑战。通过引入“面向服务的架构”,Chrome致力于构建更加灵活和高效的浏览器架构,以满足不断增长的需求和提升用户体验。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《浏览器工作原理与实践》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(251)

  • 最新
  • 精选
  • Geek_f7f72f
    即使是如今的多进程架构,我偶尔还会碰到一些由于单个页面卡死最终崩溃导致所有页面崩溃的情况,请问这是什么原因呢

    作者回复: 是这样的,通常情况下是一个页面使用一个进程,但是,有一种情况,叫"同一站点(same-site)",具体地讲,我们将“同一站点”定义为根域名(例如,geekbang.org)加上协议(例如,https:// 或者http://),还包含了该根域名下的所有子域名和不同的端口,比如下面这三个: https://time.geekbang.org https://www.geekbang.org https://www.geekbang.org:8080 都是属于同一站点,因为它们的协议都是https,而根域名也都是geekbang.org。你也许了解同源策略,但是同一站点和同源策略还是存在一些不同地方,在这里你需要了解它们不是同一件事就行了。 Chrome的默认策略是,每个标签对应一个渲染进程。但是如果从一个页面打开了新页面,而新页面和当前页面属于同一站点时,那么新页面会复用父页面的渲染进程。官方把这个默认策略叫process-per-site-instance。 直白的讲,就是如果几个页面符合同一站点,那么他们将被分配到一个渲染进程里面去。 所以,这种情况下,一个页面崩溃了,会导致同一站点的页面同时崩溃,因为他们使用了同一个渲染进程。 为什么要让他们跑在一个进程里面呢? 因为在一个渲染进程里面,他们就会共享JS的执行环境,也就是说A页面可以直接在B页面中执行脚本。因为是同一家的站点,所以是有这个需求的。

    2019-08-06
    25
    946
  • 空间
    感觉挺好奇的,单进程浏览器开多个页面,渲染线程也只有一个吗?感觉一个页面开一个线程不是更合理吗?

    作者回复: 之前回答的有点笼统,下面是我整理过后的回答: 首先这个问题提的很好,我们从IE6开始讲起,IE6时代,浏览器是单进程的,所有页面也都是运行在一个主线程中的,当时IE6就是这样设计,而且此时的IE6是单标签,也就是说一个页面一个窗口。 这时候,国内有很多国产浏览器,都是基于IE6来二次开发的,而IE6原生架构就是所有页面跑在单线程里面的,意味着,所有的页面都共享着同一套JavaScript运行环境,同样,对于存储Cookie也都是在一个线程里面操作的。 而且这些国产浏览器由于需要,都采用多标签的形式,所以其中的一个标签页面的卡顿都会影响到整个浏览器。 基于卡顿的原因,国内浏览器就开始尝试支持页面多线程,也就是让部分页面运行在单独的线程之中,运行在单独的线程之中,意味着每个线程拥有单独的JavaScript执行环境,和Cookie环境,这时候问题就来了: 比如A站点页面登陆一个网站,保存了一些Cookie数据到磁盘上,再在当前线程环境中保存部分Session数据,由于Session是不需要保存到硬盘上的,所以Session只会保存在当前的线程环境中。这时候再打开另外一个A站点的页面,假设这个页面在另外一个线程中里面,那么它首先读取硬盘上的Cookie信息,但是,由于Session信息是保存在另外一个线程里面的,无法直接读取,这样就要实现一个Session同步的问题,由于IE并没有源代码,所以实现起来非常空难,国内浏览器花了好长一点时间才解决这个问题的。 Session问题解决了,但是假死的问题依然有,因为进程内使用了一个窗口,这个窗口是依附到浏览器主窗口之上的,所以他们公用一套消息循环机制,消息循环我们后面会详细地讲,这也就意味这一个窗口如果卡死了。也会导致整个浏览器的卡死。 国产浏览器又出了一招,就是把页面做成一个单独的弹窗,如果这个页面卡死了,就把这个弹窗给隐藏掉。 这里还要提一下为什么Chrome中的一个页面假死不会影响到主窗口呢? 这是因为chrome输出的实际上图片,然后浏览器端把图片贴到自己的窗口上去,在Chrome的渲染进程内,并没有一个渲染窗口,输出的只是图片,如果卡住了,顶多图片不更新了。 国产浏览器这一套技术花了四五年时间,等这套技术差不多成熟时,Chrome发布了 :(

    2019-08-06
    20
    176
  • 匡晨辉
    老师,您好。我有个疑惑,您提到浏览器主进程负责将渲染进程生成的图片显示在ui上面,就是说渲染进程输出的最终是图片,浏览器显示的是图片,那么为什么浏览器中鼠标能选中文字?如果页面是图片的话文字是选不中的啊,这里面的机制又是怎样的?

    作者回复: 点击鼠标选中文字的时候,这些消息会传递到渲染进程,渲染进程再合成选中文字的状态,然后更新图片!

    2019-12-03
    11
    128
  • STAN_LIN
    虽然说 Google Chrome/Chromium 的市占率以及代表性都最为突出,但仍然十分希望在讲解 Chrome 各种功能的实现时能够穿插讲解/对比 Mozilla Firefox,尤其是 Firefox Quantum。 毕竟 Google Chrome 也不一定全部都是 best practices 以及此专栏主题为《浏览器工作原理与实践》而非《Chrome 工作原理与实践》不是? 一名 Mozilla Firefox Nightly 用户留。

    作者回复: 这个建议很好,后续课程我考虑按照你这个思路来规划下。

    2019-08-05
    4
    120
  • nissan
    请问老师,如果打开了 2个页面,会有几个进程呢?是 1 个网络进程、1 个浏览器进程、1 个 GPU 进程以及 2个渲染进程,共 5个吗?这些进程是可以在浏览器开发者中被实际观察到的吗?

    作者回复: 通常情况下会是五个,但是有很多其他情况: 1:如果页面里有iframe的话,iframe也会运行在单独的进程中! 2:如果页面里有插件,同样插件也需要开启一个单独的进程! 3:如果你装了扩展的话,扩展也会占用进程 4:如果2个页面属于同一站点的话,并且从a页面中打开的b页面,那么他们会公用一个渲染进程 这些进程都可以通过chrome的任务管理器来查看。

    2019-08-06
    10
    99
  • lacaja
    老师好,我有个疑问,Chrome排版引擎现在是blink,这一点从哪里可以看到呢?我在76版本Chrome的navigator属性值里只看到了AppleWebkit,不理解这是为什么?

    作者回复: 你说的是UserAgent,又称为UA,UA是浏览器的身份证,通常,在发送HTTP请求时,UA会附带在HTTP的请求头中user-agent字段中,这样服务器就会知道浏览器的基础信息,然后服务器会根据不同的UA返回不同的页面内容,比如手机上返回手机的样式,PC就返回PC的样式。 你也可以在浏览器的控制台中输入: navigator.userAgent 来查看当前浏览器的UA信息。 FireFox中的打印的信息是: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0" Chrome中打印的信息是: "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Mobile Safari/537.36" 安卓系统中的Chrome浏览器: "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Mobile Safari/537.36" 我们知道了服务器会根据不同的UA来针性的设计不同页面,所以当出了一款新浏览器时,他如果使用自己独一无二的UA,那么之前的很多服务器还需要针对他来做页面适配,这显然是不可能的,比如Chrome发布时他会在他的UA中使用“Mozilla” ,“AppleWebKit”,等关键字段,用来表示他同时支持Mozilla和AppleWebKit,然后再在最后加上他自己的标示,如Chrome/xxx。 这就解释了为什么你查看的信息中含有WebKit字样。

    2019-08-08
    7
    85
  • 许童童
    老师讲得好,我这里放一下自己的总结。 早期浏览器: 不稳定(单独进程) 不流畅(单独进程) 不安全(沙箱) 早期多进程架构: 主进程 渲染进程 插件进程 现代多进程架构: 主进程 渲染进程 插件进程 GPU进程 网络进程 未来: 面向服务架构

    作者回复: 总结的很好👍

    2019-08-06
    2
    56
  • Michael Cheng
    一个角度来说,最大动力就是chrome的出现。曾经的IE像极了诺基亚,chrome就像是横空出世的iPhone ,当着IE的面告诉IE,浏览器应该这么玩儿。 另一个角度也是互联网的发展需要,人们所需要的不再是只是简单展示个页面的浏览器,需要有复杂的交互,浏览器应该能做更多的事情,这对浏览器的稳定性、以及性能都有了新的要求。所以出来一个性能符合要求的浏览器也是必须的。 还有就是11年后相对规范的es5的出现,再之后es6.7,web能做的事情越来越多了,web工程化,再后来node的出现,前端体系越来越庞大,

    作者回复: 👍

    2019-08-05
    2
    42
  • Rocky
    为什么单进程浏览器当时不可以采用安全沙箱?

    作者回复: 如果一个进程使用了安全沙箱之后,该进程对于操作系统的权限就会受到限制,比如不能对一些位置的文件进行读写操作,而这些权限浏览器主进程所需要的,所以安全沙箱是不能应用到浏览器主进程之上的。

    2019-08-06
    40
  • Geek_8476da
    老师为什么我这多了一个v8代理解析工具

    作者回复: Chrome支持使用JavaScript来写连接代理服务器脚本,又称为在线pac代理脚本,pac脚本具体什么样子你可以搜索“PAC代理脚本”,总之使用pac代理脚本可以实现一些那啥的事。 刚开始的时候啊,Chrome是在浏览器进程里面解析pac代理脚本的,由于是JavaScript脚本,所有需要在浏览器进程里面引入V8,不过把V8运行在浏览器进程似乎不太好,于是Chrome团队后来就把这个功能独立出来一个进程了,这个进程就叫着“Utility: V8 Proxy Resolver”。 英文好的话可以看他们提供的官方文档:https://docs.google.com/document/d/1n5hr4KJhZl2A4MicTfmyiHPdiKp7kmUoWXnRBN8SrZE/edit#

    2019-08-13
    3
    28
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部