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. js/jquery 禁用点击事件

    前言 工作中经常遇到这种情况:验证邮箱页面的重新发送需要在3分钟后才可以点击触发请求,所以在这之前需要禁用他的点击. 网上查了后有以下几种实现方法 1.css禁用鼠标点击事件 .disabled { ...

  2. WIN10 vagrant和virtualbox虚拟机和一键搭建lnmp环境配置thinkphp虚拟主机

    版本:win10系统 virtualbox:5.1.26 vagrant :1.9.7 centos 7.0 xshell/git 首先下载好对应版本的软件 配置vagrant和virtualbox ...

  3. kubeadm常见报错和解决方法

    k8s随着社区不断壮大国内使用率现在也是比较高的,常用的部署方式主要还是以二进制和kubeadm为主,当然1.13之前大部分人还是以二进制,但是随着版本更新kubeadm已经逐步适用于生成环境,由于k ...

  4. oracle-sql优化-通过分组和缓存减少不必要的读

    环境:aix 7.1,oracle12.1.0.2 cdb 优化前SQL select * from (select row_.*, rownum rownum_ from (select '弱覆盖' ...

  5. springboot在yml配置文件中配置类的属性笔记

    首先建立一个简单的实体类,我这里以学生为例,并加上@Component和@ConfigurationProperties(prefix ="student")注解,其中prefix ...

  6. Cygwin安装篇,windows平台上运行的类UNIX模拟环境

    1.虚拟光驱的安装 虚拟光驱下载 一路下一步,不再阐述,这些广告选项不要选 2.安装文档,双击ISO文档 ISO下载地址 链接:http://pan.baidu.com/s/1miFVCYO 密码:z ...

  7. GUI小程序---理解GUI

    package com.gui; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent ...

  8. js分割字符串

    js分割字符串 我想达到通过 : 分割 只要第一次分割,后面的内容不使用分割 不行,没找到可以直接用的方法,不过可以通过其它方式达到效果 eg: str.split(':',2)[0] (第一个分隔符 ...

  9. C调用约定__cdecl、__stdcall、__fastcall、__pascal分析

    参考原文地址:https://www.cnblogs.com/yenyuloong/p/9626658.html C/C++ 中不同的函数调用规则会生成不同的机器代码,产生不同的微观效果,接下来让我们 ...

  10. 电子商城实录------定义init初始化的方法

    路由方法的设置 //路由方法 private static function dispatch(){ //获取控制器名称(类比:英文单词的后缀) $controller_name=CONTROLLER ...