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

原文: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设计文档-多进程资源加载

时间: 2024-10-06 08:34:35

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

Chrome设计文档-多进程架构

chromium multi-process architecture 本文档从high-level的角度描述Chromium的多进程架构. 问题 要构建一个决不崩溃或挂起的渲染引擎几乎是不可能的.同样的,要构建一个100%安全的渲染引擎也是不可能的. 从某些角度来看,当今的web浏览器有点类似于过去的单用户,多任务操作系统.正如一个异常的程序会导致整个系统down掉,一个异常的网页也会导致一个现代浏览器挂掉. 现代操作系统之所以更加健壮利益于它们把应用放到隔离的进程中.一个应用的崩溃不会影响其

Chromium多进程资源加载

webkit笔记,主要来自 朱永盛 <WebKit技术内幕> 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买 多进程 资源的实际加载在各个WebKit Port中有不同的实现.Chromium采用的是多进程的资源加载机制 根据带有资源缓存机制的资源加载过程,在ResourceHandle类之下的部分,是不同的移植对获取资源的不同实现. 在Chromium中,获取资源的方式是利用多进程的资源加载架构.如下图,描述了 关于 Chromium

selenium 处理ajix以及文档为未加载完导致的元素定位失败的解决方案

一.解决思路 我们一般的处理方式是加睡眠时间sleep以及通过显示等待某个元素出现后再去执行我们需要的相关操作.但是这两种方式都有很明显的弊端. 第一种方式sleep固定时间,缺点为:1.浪费时间,有时元素已加载ok,但是还是要等sleep时间结束才执行:2.不稳定.较难权衡一个比较合适的等待时间,有时服务器端慢,导致超时了元素还未加载(有的元素是服务器返回的),此时便会抛出元素超时的异常.3.脚本冗余.呆板. 第二种方式通过wait的until函数,加一个条件去显示等待,若找到就直接返回,超时

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

实现效果: 这个其实是一个非常常见的功能,大家都会考虑给自己简单的工程做一个背景界面.其实只要在view类中重载OnEraseBkgnd()这个函数就好了. 代码如下: BOOL CdddView::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CString string("b.bmp"); HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),strin

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

<!DOCTYPE html> <html> <body> <h1>My First Web Page</h1> <p>My First Paragraph.</p> <button onclick="myFunction()">点击这里</button> <script> function myFunction() { document.write("糟糕

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

个人理解是当触发某个包含document.write()的事件,HTML页面中body中的元素会消失,显示document.write()里面的内容.如下面的代码: 1 <p>我的第一个段落</p> 2 <button onclick="changeP()">点击<button> 3 function changeP(){ 4 document.write(Date()); 5 } 点击确定以后标签p和button里面的内容消失,在页面上

C# 加载xml文档文件及加载xml字符串

//创建XmlDocument对象 XmlDocument xmlDoc = new XmlDocument(); //载入xml文件名 xmlDoc.Load(filename); //如果是xml字符串,则用以下形式 xmlDoc.LoadXml(xmldata); //读取根节点的所有子节点,放到xn0中 XmlNodeList xn0 = xmlDoc.SelectSingleNode("Document").ChildNodes; //查找二级节点的内容或属性 foreach

Python Django框架实现商城项目源码加设计文档和注释

Python Django框架实现商城项目源码加设计文档和注释 链接:https://pan.baidu.com/s/1yN2iBgx3zmpTkoY8u1LWRg 提取码:lfsx 非常完整的django项目源码,分享给撸友们,不管是学习还是深造,都是可以学习借鉴的!! 原文地址:https://www.cnblogs.com/zyxlovesjy/p/12115491.html

也许是被误解的浏览器资源加载优化

几乎每一个前端程序员都知道应该把script标签放在页面底部.关于这个经典的论述可以追溯到Nicholas的 High Performance Javasript 这本书的第一章Loading and Execution中,他之所以建议这么做是因为: Put all <script> tags at the bottom of the page, just inside of the closing </body> tag. This ensures that the page c