WebKit之多进程模型2

转载 2015年11月20日 00:09:28

相信你一定有这样的经历:打开很多个页面,不幸的是其中某个页面不响应了或者崩溃了,随之而来的是更不幸的事,所有页面都不响应或者都崩溃了。最让人崩溃的是其中一些页面还有未保存或者未发送的信息!

这绝对是不堪回首的过去。但是,现在好了,现代浏览器很多都支持多进程模型,这个模型可以很好地避免上面的问题,虽然它很复杂而且也有自身的问题,例如更多的资源消耗,但是它的优势也是非常明显地。

chromium的多进程架构至少带来三点好处,其一是避免单个页面的不响应或者奔溃影响整个浏览器的稳定性;其二是当第三方插件奔溃时候不会影响页面或者浏览器的稳定性;其三是方便了安全模型的实施,也就是说沙箱模型是基于多进程架构的。其实,这很大程度上也是WebKit2产生的原因。那么,这是怎么做到的呢?

下图给出了缺省的chromium浏览器的进程模型。方框代表进程,连接线代表IPC进程间通信。


通常来讲,chromium浏览器包括以下主要进程类型:

1.   Browser进程:浏览器的主进程,负责浏览器界面的显示,各个页面的管理,其他各种进程的管理;

2.   Render进程:页面的渲染进程,负责页面的渲染工作,WebKit的工作主要在这个进程中完成;

3.   NPAPI插件进程:每种类型的插件只会有一个进程,每个插件进程可以被多个Render进程共享;

4.   GPU进程:最多只有一个,当且仅当GPU硬件加速打开的时候才会被创建,主要用于对3D加速调用的实现;

5.   Pepper插件进程:同NPAPI插件进程,不同的是为Pepper插件而创建的进程

Chromium浏览器的进程模型,包括以下特征:

1.   browser进程和页面是分开的,这保证了页面的奔溃不会导致浏览器主界面的奔溃;

2.   每个页面是独立的进程,这保证了页面之间相互不影响;

3.   插件进程也是独立的,插件的问题不会影响浏览器主界面和页面;

4.   GPU硬件加速进程也是独立的。

因为这么多的进程,开发者通常需要知道进程列表中的进程类别,这很简单,可以通过进程的命令行参数"--type"来识别。

有趣的是,就在我写下上面这段文字的时候,我的chrome浏览器的flash插件崩溃了,幸运的是其他一切都很好,感谢chrome的多进程模型!

 

##模型的类型

其实介绍了进程模型,其实Chromium支持多种进程模型,特别是对页面而言,下面简单的介绍以下模型的类型:

###Process-per-site-instance

该类型的含义是为每一个页面都创建一个独立的Render进程,不管这些页面是否来自于同一域。举个例子来讲,例如,用户访问了milado_njuCSDN博客(我的博客),然后从个人主页打开多篇文章时,每篇文章的页面都是该域的一个实例,因而它们都有各自不同的渲染进程。如果新打开CSDN博客的主页,那么就是另一个实例,会重新创建进程来渲染它。这带来的好处是每个页面互不影响,坏处自然是资源的巨大浪费。

###Process-per-site

该类型的含义是为属于同一个域的页面共享同一个进程,而不同一个域的网页则分属不同的进程。好处是对于相同的域可以共享,相对较小的内存消耗,坏处是可能会有特别大的Renderer进程。可以在命令行加入参数--process-per-site来尝试它。

###Process-per-tab

该类型的含义是为每个标签页创建一个独立的进程,这也是chrome/chromium的缺省行为

###Single process

该类型的含义是不为页面创建任何独立的进程,所有渲染工作都在browser进程中。但是这个类型只是实验性质的,不稳定,因而不推荐使用,只有在比较单进程和多进程时候比较有用,可以在命令行加入参数--single-process来尝试它。


值得提出的是,在Android系统上,不是上面的模型都支持的很好。


##沙箱模型

在页面的多进程模型中,页面的渲染是运行在沙箱模型中的Render进程中实现的,这些渲染引擎没有访问本地资源的能力(例如文件系统,窗口系统,等等),这可以保护渲染引擎被入侵。

WebKit之多进程模型

##概述 前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移植的实现。在Chromium中,它采用了多进程资源加载机制。本章带你了解背后的...
  • sauphy
  • sauphy
  • 2015年11月20日 00:07
  • 194

Webkit之多进程分析

在WebKit模块化分析>>中说到WebKit2中的多进程模型。多进程模型已经是浏览器的基本架构要素,下面展开分析一下WebKit2中的多进程模型。 协作决定接口,确立责任分工后,对...
  • sauphy
  • sauphy
  • 2015年11月17日 00:27
  • 394

WebKit之多线程模型

前面我们介绍过Chromium是基于多进程模型的架构设计,那么各个进程内的情况呢?事实是每个进程都有很多的线程,特别是browser进程,因而它也基于多线程模型的。介绍多线程机制之前,先来看一下残酷的...
  • sauphy
  • sauphy
  • 2015年11月20日 00:08
  • 468

WebKit之GPU进程启动过程分析

Chromium除了有Browser进程和Render进程,还有GPU进程。GPU进程负责Chromium的GPU操作,例如Render进程通过GPU进程离屏渲染网页,Browser进程也是通过GPU...
  • sauphy
  • sauphy
  • 2016年01月13日 00:26
  • 726

WebKit技巧:如何用GDB进行调试

对于Android中的Webkit(libwebcore.so),因为它是系统底层的库,所以没有办法像App和Frameworks那样直接用Eclipse来调试,因为它们都是C和C++语言,所以对于它...
  • hitlion2008
  • hitlion2008
  • 2012年07月22日 18:46
  • 5042

系列3|走进Node.js之多进程模型

文:正龙(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 之前的文章“走进Node.js之HTTP实现分析”中,大家已经了解 Node.js 是如何处理 HTTP 请求的,在...
  • lszy16
  • lszy16
  • 2018年01月29日 11:50
  • 28

Node.js进程守护,防止程序崩溃自动退出

最近用node在写一个TCP Socket服务器,但是客户端异常断开后,服务器会报错[Error: read ECONNRESET]错误,然后挂掉,上网查了相关文章,没有好的方法,最好的就是对服务器程...
  • wudiazu
  • wudiazu
  • 2017年01月08日 18:45
  • 2834

Linux进程模型2

1、execve函数 在父进程中fork一个子进程,在子进程中调用execve函数启动新的程序,代替 原有进程,被执行进程的PID不会改变。例子代码如下: int main(int arg,...
  • zangyongcan
  • zangyongcan
  • 2016年07月18日 22:00
  • 195

进程模型--IIS

唉,非开源,性能极差,只有一个有点特殊概念ISAPI     CGI                n VS n     FastCGI        m(可配置) VS n  ...
  • anghlq
  • anghlq
  • 2013年04月26日 21:54
  • 1339

多进程爬虫

这几天得准备考研复试了,紧张,就没怎么更新博客 把自己这几天爬虫的知识代码总结下 本来准备用BeautifulSoup进行获取标签的,但是没找到好的方法,发现自己还是最适合使用xpath…..对内容...
  • acsunqi
  • acsunqi
  • 2016年03月14日 21:04
  • 987
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit之多进程模型2
举报原因:
原因补充:

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