WebKit之多进程模型
2015-11-20 00:07
190 查看
##概述
前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移植的实现。在Chromium中,它采用了多进程资源加载机制。本章带你了解背后的故事。
##多进程资源加载机制
Chromium的资源加载机制,其实也就是实现ResourceHandle之下的工作。Chromium的资源加载进程如下图所示。
通过对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进程对这些消息的反馈。
上图还有两个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中的资源加载相关类
前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移植的实现。在Chromium中,它采用了多进程资源加载机制。本章带你了解背后的故事。
##多进程资源加载机制
Chromium的资源加载机制,其实也就是实现ResourceHandle之下的工作。Chromium的资源加载进程如下图所示。
通过对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进程对这些消息的反馈。
上图还有两个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中的资源加载相关类
相关文章推荐
- WebKit之消息循环
- 出现Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 错误的解决方法
- NSInvocation类的学习
- 1046. Shortest Distance (20)
- WebKit之网络栈
- 1046. Shortest Distance (20)
- URAL 1354 Palindrome. Again Palindrome (回文 + KMP)
- 初识Linux--Federa
- 前端计划第四天--grunt
- 蓝懿 iOS 技术交流和心得分享 11.19
- android 回调接口学习(自定义Dialog 获取数据数据回调)
- 10018---JavaWeb基础--过滤器(Filter)
- JAVA中怎样把用户输入的字符串存入数组中?
- [ecshop 资料]ECshop彻底去版权(同时适用于2.7.3)
- WebKit之Canvas2D实现
- 什么是 GraphQL?
- 微信支付开发IOS图文教程案例
- 好人还是能人?
- asp.net微信开发(永久素材管理)
- Python实现将xml导入至excel