2.2.3 Blink的运行和退出
- 运行:任何使用Blink的场景都需调用 BlinkInitializer::Initialize() 初始化
- 退出:渲染器被强制退出,而不会被清理
2.2.4 Blink的项目代码结构
- platform:低级功能集合,如单片内核、几何、图形工具
- core:core与DOM紧密结合
- web:实现规范中的web平台功能
- modules:包含独立的功能,如web audio,indexed db等。
- bindings / core:大量使用V8 API
- controller:一组使用core、modules的高级库,如devtools。
- 依赖关系:Chromium -> controller -> modules / bindings -> core / bindings -> platform -> 低级单元(base、V8、cc)
2.2.5 platform内部构成
1) WTF:统一编码原语,如WTF::Vector, WTF::HashSet, WTF::HashMap, WTF::String and WTF::AtomicString来代替std:vector 等。
2) 内存管理:a. PartitionAlloc b.Oilpan(Blink GC) c.malloc/free/new/delete
3) 任务调度:为提高渲染引擎的响应,应执行异步。所有任务都应发布到Blink Scheduler任务队列,指定正确类型并设置优先级,以使得能巧妙地安排任务。
4) Page/Frame/Document/ExecutionContext/DOMWindow
分别对应选项卡、iframe、window.document、主线程和工作线程上下文、JavaScript中的窗口对象。
渲染进程中各种数量关系
- 渲染器进程/Page = 1/N
- 页数/帧= 1/M
- 框架/DOMWindow/文档(或ExecutionContext)= 1/1/1 (会随时变化)
5) 进程外iframe
站点隔离:为每个站点创建一个渲染器进程(相同一二级域名)。跨站点由两个渲染器托管。
6) 分离的iframe/文件
doc = iframe.contentDocument iframe.remove() //iframe 与 dom 树分离 doc.createElement('div'); //仍可在分离的框架上运行脚本
左滑可查看完整代码,下同
7) Web IDL绑定
8) V8
- Isolate:一一对应物理线程。主线程、工作线程都有自己的独立线程。
- Context:对应全局对象,如为Frame时对应Frame的窗口对象,每个帧都有自己的窗口对象
- World:支持Chrome扩展程序内容脚本
关系:一个frame = N个窗口对象 = 用于N个world。Context对应该窗口对象
V8的API低级且难以使用,在platform/bindings中提供很多V8 API辅助类。每个C DOM对象,如Node都有其对应的V8包装器。V8包装器对应的C DOM对象具有强引用。C DOM对象只对V8包装器弱引用。
2.3 V8
V8是Google的开源高性能JavaScript和WebAssembly引擎,用C 编写,它实现ECMAScript和WebAssembly,可独立运行或嵌入到任何C 应用程序中,如Chrome和Node.js。
相关资料ECMAScript:https://tc39.es/ecma262/ WebAssembly:https://webassembly.github.io/spec/core/二、Chrome的多进程架构
注意:以下内容根据 Mariko Kosaka 的英文原版《Inside look at modern web browser》(见参考文献),进行翻译、理解、总结提炼、条理化、加入应用示例、进行相关知识补充扩展而来。
1. 背景:计算机的核心是CPU和GPU
CPU:Center Processing Unit,同时支持并行、串行操作,需很强通用性处理不同数据类型、要支持复杂通用逻辑判断,需引入大量分支和中断处理,结构异常复杂。
GPU:Graphics Processing Uint,专为执行图形渲染必须的复杂的数学和几何计算而设计。