原文:Multi-process Resource Loading

背景

浏览器主进程及browser process处理所有的网络通信。原因有三点:

  1. Browser process可以控制每一个renderer进程的网络访问
  2. Browser process可以在进程间管理session状态,保持其一致性
  3. Browser process可以针对每个host管理最大链接数

概述

作为一个多进程应用,Chrome分为三层。最底层的是webkit库,它主要负责页面渲染工作。之上是渲染进程Renderer Process(简单来说,就是一个tab一个渲染进程)。每一个渲染进程包含一个WebKit实例。而管理这些渲染进程的则是最上层的Browser Process。这一层控制者所有的网络访问。

WebKit

WebKit中负责拉取数据的对象是ResourceLoader。每一个loader均对应一个ResourceHandle。后者用于执行网络请求。ResourceHandle的头文件在WebKit代码里。我们无意于fork它。幸运的是,ResourceHandle有一个被称为d的成员(ResourceHandleInternal)。我们移除了原有实现,替换成我们的实现。实现代码在webkit/glue/resource_handle_win.cc。尽管名字中带有win标识,但它与Win32没有一毛钱的关系。

ResourceHandleInternal实现纯虚接口ResourceLoaderBridge::Peer。该接口类定义位于webkit/glue/resource_loader_bridge.h文件中。Renderer使用该callback接口向WebKit发送数据及其它事件(什么其它事件呢??)。

WebKit中的ResourceHandleInternal通过ResourceLoaderBridge纯虚接口与WebKit对话。该接口的一个实现参见ResourceLoaderBridge::Create。Create方法由Renderer实现。而Shell则使用不同的资源加载器,所以,也提供一种不同的实现方案。

Renderer

ResourceLoaderBridge在Renderer中的实现为IPCResourceLoaderBridge。该类位于renderer/resource_dispatcher。它使用一个全局的单例对象ResourceDispatcher(每个Render Process对应一个)生成一个唯一的请求ID,然后把请求转发给Browser(通过IPC方式)。响应数据则由Browser根据请求ID回送给ResourceLoaderBridge:Peer对象。

请求与数据间的对话由common/resource_loader_ipc完成。

Browser

RenderProcessHost对象(原作者也是个懒虫,图中居然没有)接收来自Renderer的IPC请求。它把请求转发给全局对象ResourceDispatcherHost。ResourceDispatcherHost保留RenderProcessHost的指针地址,通过地址来引用render process host。ResourceDispatcherHost根据请求ID来唯一标识一个请求。

Browser将每一个请求转化为URLRequest对象。URLRequest会把请求交给其内部类URLRequestJob。URLRequestJob与具体协议有关(又是个干活的哦)。当URLRequest有通知时,它的ResourceDispatcherHost::Receiver和请求ID则用于发送通知给正确的RenderProcessHost。RenderProcessHost负责把通知发送给Renderer。

Cookies

(说到网络,Cookies是不得不谈的,它方便又恶毒。)所有的Cookies均由CookieMonster(居然叫monster)处理。该类位于/net/base目录下。我们不在WinInet(?)中共享cookies。cookie monster生存于browser进程中,处理所有的网络请求。

如果一个文档需要请求cookies,Pages可以通过调用document.cookie来为它请求cookies。当该调用发生时,我们从Renderer发出一个同步消息给Browser,达到请求cookies的目的。当Browser处理cookie时,WebKit会挂起。当Renderer的I/O收到来自Browser的响应时,Renderer取消WebKit挂起,把结果回送给JavaScript引擎。

Chrome设计文档-多进程资源加载的更多相关文章

  1. Chrome设计文档-多进程架构

    chromium multi-process architecture 本文档从high-level的角度描述Chromium的多进程架构. 问题 要构建一个决不崩溃或挂起的渲染引擎几乎是不可能的.同 ...

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

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

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

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

  4. nf-Press —— 在线文档也可以加载组件和编写代码

    如果帮助文档可以加载组件,那么在介绍的同时就可以运行演示demo,是不是很酷? 如果可以在线修改运行代码,那么是不是更容易理解? 上一篇 https://www.cnblogs.com/jyk/p/1 ...

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

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

  6. Chromium多进程资源加载

    webkit笔记,主要来自 朱永盛 <WebKit技术内幕> 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买 多进程 资源的实际加 ...

  7. Android浏览本地 API文档 + 解决页面加载慢的问题

    火狐浏览器安装离线浏览插件: 用浏览器打开index.html文件,你会发现加载的很慢,原因你懂的,为此,我们可以通过离线的方式 查看本地API文档,用火狐浏览器  +   Work Offline插 ...

  8. 如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖

    <!DOCTYPE html> <html> <body> <h1>My First Web Page</h1> <p>My F ...

  9. vs2010 单文档MFC 通过加载位图文件作为客户区背景

    实现效果: 这个其实是一个非常常见的功能,大家都会考虑给自己简单的工程做一个背景界面.其实只要在view类中重载OnEraseBkgnd()这个函数就好了. 代码如下: BOOL CdddView:: ...

随机推荐

  1. IOS 学习笔记(3) 视图UITabbarController

    1.UITabbarViewController标签试图控制器.由于标签页本就起着分类的作用,所以往往呈现的视图内容之间,可以是毫不相关的功能. UITabbarViewController仍然继承自 ...

  2. win7 原版下载&激活

    参考http://bbs.ithome.com/thread-478939-1-1.html品牌机 win7 32 位系下载http://bbs.ithome.com/forum.php?mod=vi ...

  3. 帝国cms7.0判断字段为空,显示为不同

    在一些情况下,我们的字段会留空,但是又不希望内容模板上只显示空.比如,在后台,如添加作者为小明,则显示小明,不填作者则显示"佚名",我们可以用以下代码. <? if($nav ...

  4. android搭建环境错误 daemon not running. starting it now on port 5037 ADB server didn't ACK

    android搭建环境错误 daemon not running. starting it now on port 5037 ADB server didn't ACK ADB server didn ...

  5. [转载]cin、cin.get()、cin.getline()、getline()、gets()函数的用法

    1.cin>>           用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream>using namespace std;main ( ...

  6. Cloud Foundry warden container 安全性探讨

    本文将从Cloud Foundry中warden container的几个方面探讨warden container的安全性. 1. warden container互訪 1.1.  互訪原理· 在Cl ...

  7. kendo ui grid 汉化

    加入js引用 <link href="http://cdn.kendostatic.com/2014.2.716/styles/kendo.common.min.css" r ...

  8. MVC日期比较(转)

     /// <summary>     /// Specifies that the field must compare favourably with the named field, ...

  9. VS快捷键简单记录

    代码上下移动行:Alt+上下键 跳转相等大括号:Ctrl+]

  10. 两种方式在Tableau Desktop 中创建子弹图(Bullet Chart)

    子弹图,顾名思义是由于该类信息图的样子很想子弹射出后带出的轨道.起初,子弹图的发展是为了取代仪表盘上常见的那种里程表,时速表等基于圆形的信息表达方式.子弹图无修饰的线性表达方式使我们能够在狭小的空间中 ...