Chromium多进程资源加载
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 能力的服务器
Chromium多进程资源加载的更多相关文章
- 【Chromium中文文档】多进程资源加载
多进程资源加载(需要更新) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture ...
- 理解WebKit和Chromium: Chromium的多进程资源加载机制
转载请注明原文地址:http://blog.csdn.net/milado_nju ##概述 前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移 ...
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- Chrome设计文档-多进程资源加载
原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个re ...
- 【原】从一个bug浅谈YUI3组件的资源加载
篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...
- Direct2D开发:从资源加载位图
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...
- prelaod场景,用来显示资源加载进度
phaser.js的源码可以到它在github上的托管里去下载,游戏要用到的图片声音等素材资源请点击这里下载.Phaser的使用非常简单,只需要引入它的主文件,然后在页面中指定一个用来放置canvas ...
- 【Android开发学习笔记】【高级】【随笔】插件化——资源加载
前言 上一节我们针对插件最基本的原理进行了一个简单的demo实现,但是由于插件的Context对象被宿主所接管,因此无法加载插件程序的资源.那么如何解决这个问题捏? 有人提出这样的方案:将apk中的资 ...
- Duilib学习笔记《07》— 资源加载
Duilib的界面表现力能如此丰富,很大程度上得益于贴图描述的简单强大.通过之前的学习及参看相关例子,我们可以发现,在XML布局文件中,不管是窗体背景还是控件,都添加了对应的图片资源以此来美化界面.而 ...
随机推荐
- 20181009noip HZ EZ 两校联考trade(优先队列,贪心)
题面戳这里 思路: 裸的,贪心... 考场上写了一个数据分治(70ptsDP,30pts线段树优化贪心,GG了后30分) 这道题其实很简单的 我们看图: 我们在A时刻买一个东西,在B时刻卖出去,我们可 ...
- POJ 2007--Scrambled Polygon(计算凸包,点集顺序)
Scrambled Polygon Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10094 Accepted: 476 ...
- HTTP基本内容
*********************HTTP基本交互*************************** HTTP请求格式:HTTP 请求由三部分组成:请求行.请求头和请求正文请求行: 请求方 ...
- [codevs1036] 商务旅行
题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...
- Spring、Spring Boot、Spring Frame、Spring MVC的区别
Spring框架就像一个厂商,其下有很多产品,如Spring Boot.Spring Frame.Spring Cloud等等. Spring Boot用于快速.方便.简单的搭建一个Spring项目. ...
- raid概述与CentOS7.4中raid5的搭建与测试
前言 一.raid的定义与作用 raid(独立冗余磁盘阵列).raid技术通过把多个硬盘设备组合成一个容量更大的,安全性更好的磁盘阵列.把数据切割成许多区段后分别放在不同的物理磁盘上,然后利用分散读写 ...
- Vue 2.0 组件库总结
UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...
- thinkphp phpmailer邮箱验证
thinkphp 关于phpmailer的邮箱验证 一 . 登陆自己的邮箱,例如:qq邮箱.登陆qq邮箱在账户设置中开启smtp服务: 之后回发送一个授权码 , 这个授权码先保存下来,这个授权码在后 ...
- 中国农产品信息网站scrapy-redis分布式爬取数据
---恢复内容开始--- 基于scrapy_redis和mongodb的分布式爬虫 项目需求: 1:自动抓取每一个农产品的详细数据 2:对抓取的数据进行存储 第一步: 创建scrapy项目 创建爬虫文 ...
- 51定时器控制4各led,使用回调函数机制
程序转载自51hei,经过自己的实际验证,多了一种编程的思路技能,回调函数的基本思想也是基于事件机制的,哪个事件来了, 就执行哪个事件. 程序中,最多四个子定时器,说明51的处理速度是不够的,在中断中 ...