Chromium的多进程资源加载

【欢迎转载,转载时,请注明出处http://blog.csdn.net/yl02520/article/details/21285745

原文出自Chromium的官方文档Multi-processResource Loading,本文一部分来自对原文的翻译,另外也对原文某些部分做了必要的修改和补充,也添加了一些自己的理解。

在阅读本文之前,建议先阅读另外一篇博文“Chromium浏览器的多进程架构”。

背景知识

Chromium采用多进程架构,本文主要介绍浏览器进程和渲染进程,由于渲染进程是运行在沙盒中,没有直接访问系统资源的能力(如网络资源)。渲染进程中的WebKit/Blink在渲染网页时,首先需要从网络上加载相应的资源文件,比如HTML文档以及文档中的图片、JS脚本、CSS脚本等子资源文件,那么渲染进程就需要先把这些请求通过IPC(进程间通信)的方式发送给浏览器进程,由浏览器进程统一管理和网络数据传输。

这样做有一下几个好处:1. 浏览器可以统一管理所有的资源请求;2. 浏览器进程可以缓存已经下载完毕的资源文件和Cookie,当有新的请求到达时,如果请求的资源以及存在于缓存中,就直接从缓存中提取,没必须要重新从网络上下载,这样可以节省网络带宽和资源下载的时间。3. 自从HTTP/1.1之后,浏览器要求不能为同一域名的主机打开太多的连接,因为如果一个标签页打开太多的Socket链接,可能会导致系统资源消耗过多,这可能会影响到其他标签页或者其他应用程序的运行,这在资源受限的移动平台上显得尤为重要。Chromium目前允许同一主机最多打开6个Socket链接。

总体架构


从上图可知,我们把Chromium资源文件加载的流程大致分为三层,最下面一层是WebKit/Blink层,它运行在渲染进程中的渲染线程中,负责HTML文档的解析、JavaScript/CSS脚本的解析执行和页面的布局等功能;中间一层是渲染进程中与浏览器进程通信的模块,它在渲染进程中的主线程中,负责把WebKit发出的资源请求,转发给浏览器进程;最上面一层就是浏览器进程,它负责控制所有的网络连接和通信,该模块运行在浏览器进程中的IO线程里。

WebKit/Blink

在WebKit/Blink中包括HTML文档在内的所有资源文件都是通过ResourceFetcher类来获取的,现在最新的实现对以前的WebKit资源加载流程做了改进,更多内容请参看另一篇博文“WebKit/Blink如何加载网页资源”。ResourceFethcer类中提供了获取不同资源文件的方法,例如:fetchMainResource方法获取Frame资源,由该方法发送的请求具备最高优先级;fetchImage方法获取图片文件;fetchScript方法获取JavaScript脚本文件资源等等。这些获取资源的方法通过创建和调用ResourceLoader来发送请求。

渲染进程

渲染进程对类ResourceLoaderBridge进行了实现,我们称为IPCResourceLoaderBridge,该类是在content/child/resource_dispatcher.cc中实现的(Chromium后来移动了该文件的位置),该类通过ResourceDispatcher类发送网络资源请求,每个渲染进程中有且之存在一个ResourceDispatcher对象,所有从WebKit发出的网络请求,最后都交给ResourceDispatcher处理,ResourceDispatcher先给每个请求分配一个唯一的ID号,用来区别其他请求,并且组装成一个IPC的信息包ResourceHostMsg_RequestResource,然后把该请求消息交给主线程,由主线程统一与浏览器进程进行IPC。

浏览器进程

浏览器进程中的IO线程的ResourceDispatcherHost会对渲染进程发过来的资源请求消息进行处理,ResourceDispatcherHostImpl::OnRequestResource方法来处理ResourceHostMsg_RequestResource消息,然后把每个消息请求的数据结构变换成chromium中net模块的URLRequest对象,并转发给net模块内部的URLRequestJob类,该对象负责具体网络协议的实现。当URLRequest得到数据或通知时,ResourceDispatcherHost就会收到相应消息,并根据渲染进程中创建的资源请求ID号找到相应的RenderProcessHost,最后把消息发送给渲染进程。

Cookies

在Chromium中Cookies存放在浏览器进程中,为所有的渲染进程共享,这就是为什么我们在一个标签页中登录了某个网站,打开一个新的标签页时就不用再重新输入密码登录了(手动打开一个新的标签页时使用一个新的渲染进程)。在网页中我们可以通过JavaScritpt脚本document.cookie来访问该网站的cookie值,此时渲染进程需要发送一个同步的IPC给浏览器进程,由于是同步的IPC,所以渲染进程中的渲染线程(WebKit的主循环)就会被阻塞,直到收到浏览器进程的数据返回为止,然后把获取的结果返回给JavaScript引擎,让JavaScript继续执行。
### 回答1: Chromium的进程启动顺序主要包括:初始化过程、处理消息过程、绘制过程和渲染过程。初始化过程中,Chromium会载入配置文件、建立内核进程、建立渲染进程等。然后进入处理消息过程,Chromium会接收来自浏览器内核和渲染进程的消息并处理。接着开始绘制过程,Chromium会将网页内容绘制到屏幕上,而最后一步是渲染过程,在这个过程中,Chromium会将绘制好的内容展示在浏览器中。 ### 回答2: Chromium是一种开放源代码的网页浏览器,其进程启动顺序可以简单分为以下几个步骤: 1. 主进程启动:当用户双击打开Chromium浏览器时,系统会首先启动主进程。主进程负责管理其他相关进程,如浏览器标签、插件管理、窗口调度等。 2. 渲染进程启动:在主进程启动之后,当用户打开一个新的网页或者标签时,主进程会启动一个渲染进程来处理该网页的渲染和交互。 3. GPU进程启动:在有需要的情况下,主进程还会启动GPU进程,用于处理与图形相关的任务,如3D渲染、视频播放等。 4. 插件进程启动:当用户访问需要插件支持的网页时(如Flash),主进程会启动相应的插件进程,用于加载和运行插件,以提供相应的功能和特性。 总的来说,Chromium的进程启动顺序可以概括为主进程启动,然后根据用户的操作和需要,逐渐启动渲染进程、GPU进程和插件进程等。这种进程启动方式可以提高浏览器的稳定性和安全性,同时也能更好地利用系统资源。 ### 回答3: Chromium 进程的启动顺序可以简要概括为以下几个步骤: 1. 启动浏览器进程:当用户双击 Chromium 可执行文件或创建一个新的浏览器窗口时,浏览器进程会被启动。该进程负责管理整个浏览器的生命周期和资源分配。 2. 建立渲染进程:在浏览器进程中,每个标签页或独立窗口将启动一个独立的渲染进程。渲染进程负责处理网页的渲染、脚本执行和用户交互等任务。为了提高安全性和稳定性,每个渲染进程都被隔离在自己的沙盒环境中。 3. 创建网络进程:网络进程负责处理网络请求,包括下载网页内容、JavaScript、CSS、图像等资源。当浏览器需要进行网络通信时,这个进程会被启动。 4. 启动 GPU 进程:GPU 进程是用于加速图形渲染的,它与浏览器进程和渲染进程进行通信,处理与图像相关的任务。 5. 建立插件进程:如果页面中包含 Flash 或其他插件,每个插件都将在单独的插件进程中运行。这种隔离可以防止插件的问题影响到整个浏览器的稳定性。 总结起来,Chromium 进程的启动顺序是先启动浏览器进程,然后根据需要分别建立渲染进程、网络进程、GPU 进程和插件进程。这种多进程架构的设计使得 Chromium 在安全性和稳定性方面表现出色,并能够提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值