webkit笔记,主要来自 朱永盛 《WebKit技术内幕》 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买
多进程
资源的实际加载在各个WebKit Port中有不同的实现。Chromium采用的是多进程的资源加载机制
根据带有资源缓存机制的资源加载过程,在ResourceHandle类之下的部分,是不同的移植对获取资源的不同实现。
在Chromium中,获取资源的方式是利用多进程的资源加载架构。如下图,描述了 关于 Chromium如何利用多进程架构来完成资源的加载,主要是多个 Renderer 进程
和 Browser进程之间的调用设计的主要类。
Render进程在网页的加载过程中需要获取资源,但是由于安全性(实际上,当沙箱模型打开的时候,Render进程是没有权限去获取资源)和效率上(资源共享等问题)的考虑,Render进程的资源获取实际上是通过进程间通信将任务交给Browser进程来完成,Browser进程有权限从网络或者本地获取资源
在Chromium架构中的 Renderer进程中, ResourceHandleInternal类通过 IPCResourceLoaderBridge 类 同 Browser 进程通信
IPCResourceLoaderBridge 类继承自 ResourceLoaderBridge类, 其作用是负责发起请求的对象 和 回复结果的解释工作,实际消息的接收和派发交给 ResourceDispatcher类来处理
在 Browser 进程中, 首先由 ResourceMessageFilter 类来过滤 Renderer进程的消息,如果与资源请求有关,则该过滤类转发请求 给 ResourceDispatcherHostImpl类,随即ResourceDispatcherHostImpl类创建 Browser 进程中的 ResourceLoader 对象来处理。
ResourceLoader 类是 Chromium 浏览器实际的资源加载类,它负责管理向网络发起的请求,从网络接收过来的认证请求,请求的回复管理等工作。 因为这其中每项都有专门的类老负责, 但都是由 ResourceLoader 类统一管理。
从网络或者本地文件读取信息的是 URLRequest类,实际上 它承担了 建立网络连接、发送请求数据和接受回复数据的任务,URLRequest之后的工作 交给了 协议栈
工作方式 和 资源共享
资源请求有同步和异步两种方式。
ResourceLoader 类承担了 Browser进程中有关资源的总体管理任务, 对于同步和异步两种资源请求方式,ResourceLoader类使用 SyncResourceHandle 类 和
AsyncResourceHandle 类来向 Render进程发送状态消息,并接收Render进程对这些消息的反馈,下图 描述了这些类之间的关系:
图中还有两个ResourceHandle子类,第一个是 LayeredResourceHandle类, 它同SyncResourceHandle类 与 AsyncResourceHandle类不一样,自己不直接参与资源的处理,而是将处理转给另一个ResourceHandle对象。
LayeredResourceHandle类没有实际意义,仅是BufferResourceHandle父类。该缓冲类用来缓冲网络或者文件传过来的数据,直到数据足够满足需求然后转给设置的另一个 ResourceHandle 对象。
Throttling-ResourceHandle 类 是在面对很多个资源请求时仅使用 一个 URLRequest对象来获取资源,这可以有效地减少网络的开销,因为不需要重新建立多个网络连接
此外,在Chromium中 还有很多 ResourceHandle的子类,它们的作用各异。
RedirectToFileResourceHandler: 继承自 layeredResourceHandle类,在接收到的数据转给另外一个了ResourceHandle类的同时,转存到文件
StreamResourceHandler: 继承自 LayeredResourceHandle类,在接收到的数据转给另一个 ResourceHandle的同时,转存的数据流
CertificateResourceHandler: 主要处理证书类的资源请求
资源统一交给Browser进程来处理,这使得资源在不同网页间的共享变得很容易。
接下来面临一个问题,因为每个 Renderer进程某段时间内可能有多个请求,同时还有多个 Renderer 进程, Browser进程需要处理大量的资源请求,这就需要一个处理这些请求的调度器,这就是 Chromium 中的 ResourceScheduler。
ResourceScheduler类管理的对象就是 最顶层的类 net::URLRequest 对象。ResourceScheduler类根据 URLRequest 的标记和优先级来调度 URLRequest对象,每个
URLRequest对象都有一个 Child 和 RouteId 来标记属于 哪个Renderer进程。ResourceSchedule类中有一个哈希表, 该表按照进程来组织 URLRequest对象。
对于以下类型的网络请求,立即被 Chromium 发出:
1 高优先级的请求
2 同步请求
3 具有 SPDY 能力的服务器