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布局文件中,不管是窗体背景还是控件,都添加了对应的图片资源以此来美化界面.而 ...
随机推荐
- poj_1306_Combinations
Computing the exact number of ways that N things can be taken M at a time can be a great challenge w ...
- winform Treeview控件使用
做角色菜单权限时用到treeview控件做树状显示菜单,简单总结了一下用法: 1.在winform窗体中拖入treeview控件,注意修改属性CheckBoxes属性为true,即在节点旁显示复选框 ...
- JS 控制文本框禁止输入例子
JS 控制不能输入特殊字符 <input type="text"class="domain"onkeyup="this.value=this.v ...
- java服务端项目开发规范
更新内容 2015-03-13 (请先更新svn的mybatis.xml.BaseMapper.java.Pager.java文件) 加入测试类规范 加入事物控制规范 加入mapper接口规则 ...
- SQL语句笔记/好记性不如烂笔头/持续更新
常用的增删改查操作,针对库,表,字段,记录分类有助于记忆,当然熟能生巧,还是需要多多实操 库操作 删除库 drop database dbx; 列出所有库 show databases; 切换库 us ...
- 插头DP(基于连通性状态压缩的动态规划问题)(让你从入门到绝望)
今天,我,Monkey king 又为大家带来大(ju)佬(ruo)的算法啦!--插头DP 例题(菜OJ上的网址:http://caioj.cn/problem.php?id=1489): 那么,这道 ...
- labview初始学习过程中遇到串口读取框红蓝色交替闪烁的处理
labview工程的程序框图VISA串口读取框红蓝交替闪烁,前面板接收数据错乱,或者是接受不了,这是你不小心设置了断点.
- List集合中的对象比较,取出不同对象
今天在做金碟系统与我们系统的对接的时候需要做一个客户同步 在同步时,需要比较对象,对查询出的数据库的数据进行比较 for(int i=0;i<list2.size();i++){ if(! li ...
- codeforces 845A Chess Tourney
参考:https://blog.csdn.net/zhongyuchen/article/details/77478039 #include <iostream> #include < ...
- java使用urlConnection抓取部分数据乱码
使用urlconnection做抓取的同学应该一开始都是使用这个吧.OK回到正题来..... 在内容己有中文.英文己正常显示,仍然会有部分中文或英文出现乱码,这是为什么呢?这个问题一直在心里盘旋... ...