Chromium 的多进程资源加载机制

优质
小牛编辑
137浏览
2023-12-01

前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移植的实现。在Chromium中,它采用了多进程资源加载机制。本章带你了解背后的故事。

多进程资源加载机制

Chromium的资源加载机制,其实也就是实现ResourceHandle之下的工作。Chromium的资源加载进程如下图所示。

enter image description here

通过对Chromium多进程架构的了解,我们知道Browser进程和Renderer进程及它们之间的联系。Renderer进程在网页的加载过程中需要获取资源,但是由于安全性(实际上,当沙箱模型打开的时候,Renderer进程是没有权限去获取资源的)和效率上(资源共享等问题)的考虑,Renderer进程的获取资源实际上是通过进程间通信将任务交给Browser进程来完成,Browser进程有权限从网络或者本地申请资源。 在Chromium项目架构中的Renderer进程,ResourceHandleInternal通过IPCResourceLoaderBridge跟Browser进程通信。IPCResourceLoaderBridge继承自ResourceLoaderBridge,其作用是负责请求对象和回复对象的解释工作,实际消息的接受和派发交给ResourceDispatcher来处理。 在Browser进程中,首先由ResourceMessageFilter将Renderer进程的消息过滤,如果与资源请求相关,则转发给 ResourceDispatcherHostImpl。它随即创建Browser进程中的ResourceLoader来处理。ResourceLoader是Chromium浏览器实际的资源加载类,它负责管理请求到网络,从网络过来的认证请求,回复的管理等工作。因为这其中每项都有专门的类来负责,但是都是有ResourceLoader来管理这些。从网络或者本地文件读取信息是URLRequest类,它实际上承当了建立网络连接,发送请求数据和接受回复数据的任务,URLRequest之后的工作将在网络栈章节中来解读。

工作方式和资源共享

资源请求有同步和异步两种方式。前面说了ResourceLoader类承担了Browser进程中的对资源的总体管理任务,对于同步和异步两种资源请求方式,ResourceLoader使用SyncResourceHandle和AsyncResourceHandle来向Renderer进程发送状态消息,并接受Renderer进程对这些消息的反馈。

enter image description here

上图还有两个ResourceHandle子类,第一个是LayeredResourceHandle,它同SyncResourceHandle和AsyncResourceHandle不一样,自己不直接参与资源的处理,而是将处理转给另一个的ResourceHandle。它没有实际意义,仅是BufferedResourceHandle的父类,Buffered类用来缓冲网络或者文件传过来的数据,直到数据足够满足需求然后转给设置的另一个ResourceHandle。ThrottlingResourceHandle类则是将很多个资源请求仅使用一个URLRequest来获取资源,这可以有效地减少网络的开销。 此外,在Chromium中还有很多ResourceHandle的子类,它们的作用各式各样: RedirectToFileResourceHandler:继承自LayeredResourceHandle,在将接受到的数据转给另一个ResourceHandler的同时,转存到文件。 StreamResourceHandler:继承自LayeredResourceHandle,在将接受到的数据转给另一个ResourceHandler的同时,转存到流。 CertificateResourceHandler:主要处理证书类的资源请求。 资源统一交由Browser进程来处理,这使得资源在不同页面间的共享变得很容易。接下来有个问题就是,因为每个Renderer进程某段时间内可能有多个请求,同时还有多个Renderer进程,Browser进程需要处理大量的资源请求,这就需要一个对这些请求的调度器,这就是Chromium中的ResourceScheduler。 ResourceScheduler管理的对象就是第一个图中最顶层类net::URLRequest的实例,它根据URLRequest的标记和优先级来调度它们。每个URLRequest实例都有一个ChildId和RouteId来标记它属于那个进程。ResourceScheduler中有一个哈希表,该表按照进程来组织URLRequest实例。对于以下类型的请求,立即被发出:1. 高优先级的请求;2. 同步请求;3. 具有SPDY能力的服务器。

源代码目录

content/browser/loader Chromium中的资源加载相关类

参考资料

  1. http://www.chromium.org/developers/design-documents/multi-process-resource-loading