Chrome浏览器内部揭秘(二)

·  阅读 546

本文转自 developers.google.com/ ,原作者为 Mariko Kosaka

阅读后觉得内容非常不错,为了加深记忆和理解,决定翻译一些重要的部分。(虽然掘金里已经有好几篇本文翻译了)

一切从浏览器进程而起

浏览器进程内有3个线程,他们的作用分别是:

1. UI 线程:绘制浏览器的所有按钮、输入框等界面元素,以及处理相关操作。

2. 网络线程:处理网络任务并从互联网获得数据。

3. 存储线程:控制文件的访问以及更多。

一个简单的流程

步骤 1:处理输入

当用户在地址栏输入内容的时候,UI 线程会解析输入的内容以判断这是一个搜索内容还是一个 URL,从而决定是打开默认搜索引擎还是访问 URL。

步骤 2:开始导航

当用户访问的是 URL 时,UI 线程会启动一个网络调用来获取网页内容,它让网络线程发起请求,如果网络线程收到的是重定位301的话,网络线程会返回给 UI 线程,接着 UI 线程重新启动一个网络调用。

步骤 3:读取返回内容

网络线程会读取 header 中的 Content-Type,如果是 HTML 文件的话,下一步就是将数据传给 渲染进程,而如果是 zip 或者其他文件,就会被认作是下载,于是把数据传递给下载管理器。

与此同时,SafeBrowsing 也会检查网站返回的内容是否在谷歌的恶意名单内,如果是的话则会弹出一个警告页面。

另外 CROB(跨域访问阻止)也会在此时检查,以避免跨域的数据被传到渲染进程。

步骤 4:通知渲染进程

当所有检查都完成,网络进程确保已经导航到网站的时候,网络进程通知 UI 进程数据准备完毕,由 UI 进程通知渲染进程来执行页面的渲染。

其实,UI 线程并不会等到网络线程收到返回内容再启动渲染进程,它会主动找到或启动一个渲染进程,以在获得返回内容时就能立刻执行渲染。网络线程请求内容和 UI 线程启动渲染进程是同时进行的。

步骤 5:完成导航

数据和渲染进程都准备好了,此时由浏览器进程向渲染进程发送 IPC,同时建立数据流以让渲染进程可以保持接受 HTML 数据。一旦浏览器进程接受到数据已经提交到渲染进程,导航即结束,此时文档加载阶段开始。

额外的步骤:初始化加载完成

一旦渲染进程完成渲染,它会发送 IPC 给浏览器进程,此时 UI 线程会停止标签的加载旋转。

分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改