2.Chromium 多进程资源加载
2,1 多进程
资源的实际加载在各个WebKit移植中有不同的实现。Chromium采用的多进程的资源加载机制。
ResourceHandle 类之下的部分是不同移植对获取资源的不同实现,Chromium 中是 多进程资源加载 。主要是多个Renderer进程和Browser进程之间的调用栈的主要类来实现的。
Renderer 进程在网页的加载过程中需要获取资源,但由于安全性(沙箱模型打开后 Renderer 进程没有权限获取资源)和效率(资源共享)的考虑,Renderer 进程的资源获取实际上是通过进程间的通信将任务交给 Browser 进程来完成,Browser 进程有权限从网络或者本地获取资源。
在Chromium架构的Renderer进程中,ResourceHandleInternal类通过IPCResource-LoaderBridge类同Browser进程通信,IPCResourceLoaderBridge类继承自ResourceLoaderBridge类,其作用是负责发起请求的对象和回复结果的解释工作,实际消息的接收和派发交给ResourceDispather类来处理。
在Browser进程中,首先由ResourceMessageFilter类来过滤Renderer进程的消息,如果与资源请求相关,则该过滤转发给请求给ResourceDispatherHostImpl类,随即ResourceDispatherHostImpl类创建Browser进程中的ResourceLoader对象来处理。ResourceLoader类是Chromium浏览器实际的资源加载类,它负责管理向网络发起的请求、从网络接收过来的认证请求、请求的回复管理等工作。因为这其中每项都有专门类来负责,但都是由ResourceLoader类统一管理,从网络或者本地文件读取信息的是URLRequest类,实际上它承担了建立网络链接、发送请求数据和接受回复数据的任务,URLRequest之后的工作将在“网络栈”内容中介绍。
2.2 工作方式和资源共享
资源请求有同步和异步两种方式,ResourceLoader类承担了Browser进程中有关资源的总体管理任务,对于同步和异步两种资源请求方式,ResourceLoader类使用SyncResourceHandle类和AsyncResourceHandle类来向Renderer进程发送状态消息,并接收Renderer进程对这些消息的反馈。
图中ResourceHandle子类:第一个是LayeredResourceHandle类,它同SyncResourceHandle类和AsyncResourceHandle类不一样,自己不直接参与资源的处理,而是将处理转给另一个ResourceHandle对象。LayeredResourceHandle类没有实际意义,仅是BufferedResourceHandle的父类。该缓冲网络或者文件传过来的数据,直到数据足够满足需求然后转给设置的另一个ResourceHandle对象。Throttling-ResourceHandle类是在面对很多个资源请求时仅使用一个URLRequest对象来获取资源,这可以有效地减少网络的开销,因为不需要重新建立多个网络连接。
此外,在Chromium中还有很多ResourceHandle的子类,它们的作用各异:
- Redirect T哦File Resource Handler:继承自LayeredResourceHandle类,在接收到数据转给给另一个ResourceHandler类的同时,转存到文件。
- Stream Resource Handler:继承自LayeredResourceHandle类,在接收到数据转给另一个ResourceHandler的同时,转存到数据流。
- CertificateResourceHandler:主要处理证书类1资源请求。
资源统一交给 browser 进程处理,使得网页间的资源共享容易。多个renderer进程、renderer进程的请求多,使得browser进程需要调度器,即chromium中的ResourceScheduler。
ResourceScheduler 根据 URLRequest 的标记和优先级来调度,URLRequest 中有ID来识别是哪个renderer进程。 ResourceScheduler类中有一个哈希表,该表按照进程来组织URLRequest对象,对于以下类型的网络请求,立即被Chromium发出:(1)高优先级的请求;(2)同步请求;(3)具有SPDY(一种新协议)能力的服务器.。相关的代码都在“content/browser/loader”下。