WebKit之多进程模型

转载 2015年11月20日 00:07:01

##概述

前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移植的实现。在Chromium中,它采用了多进程资源加载机制。本章带你了解背后的故事。

##多进程资源加载机制

Chromium的资源加载机制,其实也就是实现ResourceHandle之下的工作。Chromium的资源加载进程如下图所示。


通过对Chromium多进程架构的了解,我们知道Browser进程和Renderer进程及它们之间的联系。Renderer进程在网页的加载过程中需要获取资源,但是由于安全性(实际上,当沙箱模型打开的时候,Renderer进程是没有权限去获取资源的)和效率上(资源共享等问题)的考虑,Renderer进程的获取资源实际上是通过进程间通信将任务交给Browser进程来完成,Browser进程有权限从网络或者本地申请资源。

在Chromium项目架构中的Renderer进程,ResourceHandleInternal通过IPCResourceLoaderBridge跟Browser进程通信。IPCResourceLoaderBridge继承自ResourceLoaderBridge,其作用是负责请求对象和回复对象的解释工作,实际消息的接受和派发交给ResourceDispatcher来处理。

在Browser进程中,首先由ResourceMessageFilter将Renderer进程的消息过滤,如果与资源请求相关,则转发给 ResourceDispatcherHostImpl。它随即创建Browser进程中的ResourceLoader来处理。ResourceLoader是Chromium浏览器实际的资源加载类,它负责管理请求到网络,从网络过来的认证请求,回复的管理等工作。因为这其中每项都有专门的类来负责,但是都是有ResourceLoader来管理这些。从网络或者本地文件读取信息是URLRequest类,它实际上承当了建立网络连接,发送请求数据和接受回复数据的任务,URLRequest之后的工作将在网络栈章节中来解读。

##工作方式和资源共享

资源请求有同步和异步两种方式。前面说了ResourceLoader类承担了Browser进程中的对资源的总体管理任务,对于同步和异步两种资源请求方式,ResourceLoader使用SyncResourceHandle和AsyncResourceHandle来向Renderer进程发送状态消息,并接受Renderer进程对这些消息的反馈。


上图还有两个ResourceHandle子类,第一个是LayeredResourceHandle,它同SyncResourceHandle和AsyncResourceHandle不一样,自己不直接参与资源的处理,而是将处理转给另一个的ResourceHandle。它没有实际意义,仅是BufferedResourceHandle的父类,Buffered类用来缓冲网络或者文件传过来的数据,直到数据足够满足需求然后转给设置的另一个ResourceHandle。ThrottlingResourceHandle类则是将很多个资源请求仅使用一个URLRequest来获取资源,这可以有效地减少网络的开销。

此外,在Chromium中还有很多ResourceHandle的子类,它们的作用各式各样:

RedirectToFileResourceHandler:继承自LayeredResourceHandle,在将接受到的数据转给另一个ResourceHandler的同时,转存到文件。

StreamResourceHandler:继承自LayeredResourceHandle,在将接受到的数据转给另一个ResourceHandler的同时,转存到流。

CertificateResourceHandler:主要处理证书类的资源请求。

资源统一交由Browser进程来处理,这使得资源在不同页面间的共享变得很容易。接下来有个问题就是,因为每个Renderer进程某段时间内可能有多个请求,同时还有多个Renderer进程,Browser进程需要处理大量的资源请求,这就需要一个对这些请求的调度器,这就是Chromium中的ResourceScheduler。

ResourceScheduler管理的对象就是第一个图中最顶层类net::URLRequest的实例,它根据URLRequest的标记和优先级来调度它们。每个URLRequest实例都有一个ChildId和RouteId来标记它属于那个进程。ResourceScheduler中有一个哈希表,该表按照进程来组织URLRequest实例。对于以下类型的请求,立即被发出:1. 高优先级的请求;2. 同步请求;3. 具有SPDY能力的服务器。

##源代码目录

content/browser/loader

 Chromium中的资源加载相关类

相关文章推荐

Nginx深入详解之多进程网络模型

一、进程模型         Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构。与Memcached的经典多线程模型相比,Nginx是经典的多进程模型。Nginx启动后以daem...

WebKit 2浏览器内核发布 转为多进程模型

WebKit是著名的开源浏览器引擎,也是Chrome和Safari等主流浏览器的内核(Opera与Chrome的V8内核是基于WebKit开发的)。作为开源项目,它的开发主要由苹果公司主导。  ...

Linux网络编程之多进程模型编程与一个使用进程池实现的CGI服务器

一:什么是多进程模型 多进程模型是服务器在接收到大量高并发客户端访问时,通过创建多个子进程来与客户端进行通信。单进程阻塞在read()系统调用的时候,会导致服务器无法响应到其他的连接请求。这时可以通过...

linux高性能服务器编程之多进程

转载自 http://www.cnblogs.com/Anker/p/3271773.html 就喜欢这样有demo代码,自己亲身敲代码来验证概念的感觉,哈哈 1. 创建进程fork 什么是僵尸...

android之多进程下Application.getSharedPreferences的取值

在AndroidManidest.xml <application android:name="com.chat.IM"//与下面的类要一致 android:allo...

Python语言学习讲解十三:python之多进程和多线程

注:每周一到周五都会进行相关Python基础知识更新,欢迎大家提宝贵的意见 在讲解进程和线程之前,先来给大家梳理下进程、线程的概念。以及他们的区别于联系,内容比较多,对于新手来说需要仔细理解。对了老...

从零开始学网络爬虫之多进程

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process...

第2.2章 scrapy之多进程检测代理ip的有效性

1 multiprocessing Python多进程multiprocessing使用示例 mutilprocess的作用是能够像线程一样管理进程,在多核CPU利用率比threading要好的多...

nodejs之多进程

最近感觉压力有点大,来看看nodejs的书,好让自己轻松一下。

Linux网络编程之多进程

multiprocess mode//fork server #include #include #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)