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多进程资源加载的更多相关文章

  1. 【Chromium中文文档】多进程资源加载

    多进程资源加载(需要更新) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture ...

  2. 理解WebKit和Chromium: Chromium的多进程资源加载机制

    转载请注明原文地址:http://blog.csdn.net/milado_nju ##概述 前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移 ...

  3. High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载

    小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...

  4. Chrome设计文档-多进程资源加载

    原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个re ...

  5. 【原】从一个bug浅谈YUI3组件的资源加载

    篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...

  6. Direct2D开发:从资源加载位图

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...

  7. prelaod场景,用来显示资源加载进度

    phaser.js的源码可以到它在github上的托管里去下载,游戏要用到的图片声音等素材资源请点击这里下载.Phaser的使用非常简单,只需要引入它的主文件,然后在页面中指定一个用来放置canvas ...

  8. 【Android开发学习笔记】【高级】【随笔】插件化——资源加载

    前言 上一节我们针对插件最基本的原理进行了一个简单的demo实现,但是由于插件的Context对象被宿主所接管,因此无法加载插件程序的资源.那么如何解决这个问题捏? 有人提出这样的方案:将apk中的资 ...

  9. Duilib学习笔记《07》— 资源加载

    Duilib的界面表现力能如此丰富,很大程度上得益于贴图描述的简单强大.通过之前的学习及参看相关例子,我们可以发现,在XML布局文件中,不管是窗体背景还是控件,都添加了对应的图片资源以此来美化界面.而 ...

随机推荐

  1. 获取cookie,设置cookie,删除cookie

    //获取cookie export const getCookie = (name) => { var arr, reg = new RegExp("(^| )" + nam ...

  2. 一个好用的C# HttpHelper类

    /// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...

  3. php导出excel长数字串显示为科学计数方法与最终解决方法

    1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel-> ...

  4. PHP (Yii2) 自定义业务异常类(可支持返回任意自己想要的类型数据)

    public function beforeAction($action) { return parent::beforeAction($action); } public function runA ...

  5. Java学习笔记八:Java的流程控制语句之循环语句

    Java的流程控制语句之循环语句 一:Java循环语句之while: 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...

  6. 【Markdown】Markdown的使用(自用)

    # 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录 ...

  7. C# 生成机器码

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. MAVEN的项目升级

    今天我们来介绍一下版本依赖的问题 1.如果是admin的话,他要依赖于service的版本,则service的版本依赖于core的版本, 如果是本地编译,这我直接更新admin的就可以了,然后直接跑就 ...

  9. C++各种类型的简单排序大汇总~

    啊,排序的技能点也太多了吧!!!LITTLESUN快要**在排序的技能场了啊!(划掉)经历了两天48小时2880分钟172800秒的艰苦奋斗,终于终于终于学的差不多了!明天就可以去打排序的小怪喽!(撒 ...

  10. 浅谈 kubernetes service 那些事 (下篇)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 五.K8s 1.8 新特性--ipvs ipvs与iptables的性能差异 随着服务的数量增长,IPTables 规则则会成倍增长,这样带来的问题 ...