《WebKit 技术内幕》学习之四(2): 资源加载和网络栈

66 篇文章 0 订阅
48 篇文章 1 订阅

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”下。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyl_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值