使用blink内核_一文读懂浏览器内核工作原理

Chromium 的工程师们写了两篇技术文章 How Blink Works 和 How cc Works,分别介绍了 Chrome 浏览器内核内部的两个重要模块 Blink 和 cc 内部设计和实现的一些细节。对于想要了解 Chrome 内核内部实现的同学,这两篇文章提供了不错的入门指引。在征得作者同意后,我将其翻译成中文,以馈读者。

文中部分术语觉得难以翻译成合适的中文的,我会保留原文。对于一些较为复杂的概念会根据自己的理解给出一些额外的解释。如果有我理解有误,没有正确翻译的地方,也请读者留言指出。

全文阅读时间约为十分钟。

Blink 的开发并不容易。对于新的 Blink 开发者来说,这种不容易体现在内部的许许多多 Blink 特定的概念和编码约定,它们是为了实现一个高性能渲染引擎而引入的。对于有经验的 Blink 开发者来说也是不容易的,因为 Blink 非常庞大,并且对性能,内存占用和安全非常敏感。

本文旨在提供一篇指引,从一万公尺的高空概览 “Blink 是如何工作” 的全貌,我希望这能够帮助 Blink 的开发者快速了解 Blink 的整体架构设计:

  1. 本文并不是一篇完整的教程,去解析 Blink 架构的细节和编码规则(这些部分也容易因为发生变化而过时)。相反,本文简明地描述了 Blink 的基础设计,它们短期内不太容易发生变化,如果读者需要了解更多,本文包含了其它资料的指引可供进一步阅读;

  2. 本文也不对特定的特性进行解析(比如 ServiceWorkers,editing)。相反,本文描述的是基础特性,它们被其它模块所广泛使用(比如内存管理,V8 APIs)。

有关 Blink 开发的更多一般信息,请参阅 Chromium wiki 页面。

Blink 做些什么

Blink 是 Web 平台的渲染引擎。粗略地说,Blink 实现了将网页内容绘制到一个浏览器标签内的所有代码:

  1. 实现了 Web 平台的规范(也就是 HTML 标准),包括 DOM,CSS 和 Web IDL;

  2. 内嵌 V8 运行 JavaScript;

  3. 通过底层的网络栈请求资源;

  4. 构建 DOM 树;

  5. 计算样式和排版;

  6. 内嵌 Chrome Compositor 用于绘图;

Blink 的使用者比如 Chromium,Android WebView 和 Opera 通过 content public APIs 内嵌 Blink 并调用。

70fb5570622d22d3e76c5cbde25f5f96.png

从代码结构的角度来看,"Blink" 一般意味着 "//third_party/blink/" 目录下的代码。从项目的角度来看,"Blink" 一般意味着实现 Web 平台特性的项目。实现这些 Web 特性的代码分布在 "//third_party/blink/", "//content/renderer/","//content/browser/" 和其它地方。

91e7020a519ae8b7add7f7a2d20b384a.png

[译注]

1. 关于 Embedder 的概念,可以参考我的一篇旧文 - 理解 Embedder,理解 Chromium 的系统层次结构。

2. “Blink 实现了将网页内容绘制到一个浏览器标签内的所有代码” 这句话我的理解应该是指广义的 "Blink",并不仅仅指 "//third_party/blink/"。

0383da84d9517eb85f80aa33eede7c4f.png

进程/线程架构

进程

Chromium 使用多进程的架构。 Chromium 拥有一个 browser 进程和 N 个沙盒 renderer 进程。Blink 运行在 renderer 进程。

有多少个 renderer 进程会被创建?为了安全的原因,对跨站的 documents 进行内存地址空间隔离是非常重要的(这被称为 Site Isolation)。理想的情况,每个站点都应该分配一个独立的 renderer 进程,但是实际上,当用户打开太多的标签页,或者设备没有足够的内存,就很难限制每个 renderer 进程都只对应一个站点。所以有时一个 renderer 进程会被多个来自不同站点的 iframes 或者标签页所共享。这也意味着一个标签页下的 iframes 可能位于不同的 renderer 进程,或者不同标签页的 iframes 位于同一个 renderer 进程。renderer 进程,iframes,标签页三者之间不是完全 1:1 的映射关系。

因为 renderer 进程运行在沙盒环境下,Blink 需要请求 browser 进程去处理系统调用(比如文件访问,播放音频等),还有访问用户的账号数据(比如 cookie,密码等)。browser-renderer 进程间通讯是由 Mojo 来实现的。(过去是使用 Chromium IPC,现在还有很多代码仍旧继续使用。不过 Chromium IPC 已经逐步放弃,实际上它的底层也换成了用 Mojo 实现) 对 Chromium 来说,服务化还在继续进行,browser 进程会被抽象成一组服务的集合。从 Blink 的角度来看,Blink 可以通过 Mojo 跟其它服务和 browser 进程进行交互。

f110a97fc333a2da86db01f7ccc63fe0.png

如果你希望了解更多:

  1. 多进程架构

  2. Blink 的 Mojo 编程:platform/mojo/MojoProgrammingInBlink.md

线程

在 renderer 线程会创建多少个线程?

Blink 会拥有一个主线程,N 个 worker 线程和一些内部线程。

几乎所有的主要活动都发生在主线程。所有的 JavaScript 调用(除了运行在 workers 线程的 JS 代码),DOM,CSS,样式和排版计算都运行在主线程。Blink 经过高度优化来最大化主线程的性能,它的架构被认为主要是单线程的。

Blink 可能会创建若干 worker 线程来运行 Web Workers,Service Worker,和 Worklets。

Blink 和 V8 还可能会创建一些内部线程来处理 webaudio,database,GC 等等。

对跨线程通讯,你需要使用 PostTask APIs 来发送消息。我们并不鼓励使用共享内存编程,除了少数地方因为性能的

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值