概述
相信你一定有这样的经历:打开很多个页面,不幸的是其中某个页面不响应了或者崩溃了,随之而来的是更不幸的事,所有页面都不响应或者都崩溃了。最让人崩溃的是其中一些页面还有未保存或者未发送的信息!
这绝对是不堪回首的过去。但是,现在好了,现代浏览器很多都支持多进程模型,这个模型可以很好地避免上面的问题,虽然它很复杂而且也有自身的问题,例如更多的资源消耗,但是它的优势也是非常明显地。
chromium的多进程架构至少带来三点好处,其一是避免单个页面的不响应或者奔溃影响整个浏览器的稳定性;其二是当第三方插件奔溃时候不会影响页面或者浏览器的稳定性;其三是方便了安全模型的实施,也就是说沙箱模型是基于多进程架构的。其实,这很大程度上也是WebKit2产生的原因。那么,这是怎么做到的呢?
下图给出了缺省的chromium浏览器的进程模型。方框代表进程,连接线代表IPC进程间通信。
通常来讲,chromium浏览器包括以下主要进程类型:
- Browser进程:浏览器的主进程,负责浏览器界面的显示,各个页面的管理,其他各种进程的管理;
- Render进程:页面的渲染进程,负责页面的渲染工作,WebKit的工作主要在这个进程中完成;
- NPAPI插件进程:每种类型的插件只会有一个进程,每个插件进程可以被多个Render进程共享;
- GPU进程:最多只有一个,当且仅当GPU硬件加速打开的时候才会被创建,主要用于对3D加速调用的实现;
- Pepper插件进程:同NPAPI插件进程,不同的是为Pepper插件而创建的进程
Chromium浏览器的进程模型,包括以下特征:
- browser进程和页面是分开的,这保证了页面的奔溃不会导致浏览器主界面的奔溃;
- 每个页面是独立的进程,这保证了页面之间相互不影响;
- 插件进程也是独立的,插件的问题不会影响浏览器主界面和页面;
- GPU硬件加速进程也是独立的。 因为这么多的进程,开发者通常需要知道进程列表中的进程类别,这很简单,可以通过进程的命令行参数"--type"来识别。 有趣的是,就在我写下上面这段文字的时候,我的chrome浏览器的flash插件崩溃了,幸运的是其他一切都很好,感谢chrome的多进程模型!
模型的类型
其实介绍了进程模型,其实Chromium支持多种进程模型,特别是对页面而言,下面简单的介绍以下模型的类型:
Process-per-site-instance
该类型的含义是对同一个域的实例都会创建独立的进程。举个例子来讲,例如,用户访问了biandroid的CSDN博客(我的博客),然后从个人主页打开多篇文章时,每篇文章的页面都是该域的一个实例,因而它们都共享同一个的进程。如果新打开CSDN博客的主页,那么就是另一个实例,会重新创建进程来渲染它。这带来的好处是每个页面互不影响,坏处自然是资源的巨大浪费。
Process-per-site
该类型的含义是不同一个域会创建独立的进程,同一域的不同实例共享同一个进程。好处是对于不同的域可以共享,相对较小的内存消耗,坏处是可能会有特别大的Renderer进程。可以在命令行加入参数--process-per-site来尝试它。
Process-per-tab
该类型的含义是为每个标签页创建一个独立的进程,这也是chrome/chromium的缺省行为
Single process
该类型的含义是不为页面创建任何独立的进程,所有渲染工作都在browser进程中。但是这个类型只是实验性质的,不稳定,因而不推荐使用,只有在比较单进程和多进程时候比较有用,可以在命令行加入参数--single-process来尝试它。
沙箱模型
在页面的多进程模型中,页面的渲染是运行在沙箱模型中的Render进程中实现的,这些渲染引擎没有访问本地资源的能力(例如文件系统,窗口系统,等等),这可以保护渲染引擎被入侵。
参考文献
- http://www.chromium.org/developers/design-documents/process-models
相关推荐
众所周知, chromium 是多进程框架的,整个 chromium 浏览器包括四类进程: browse 主进程、 render 渲染进程、 GPU 进程和插件进程。本文所要讲述的 chromium 事件处理流程 主要牵涉到其中的两种进程: browser ...
描述了chromium开源浏览器中的安全机制,沙箱保护,多进程机制
chromium命令行参数1
ungoogled-chromium是Google Chromium,不依赖于Google Web服务。 ungoogled-chromium尽可能保留默认的Chromium体验。...有关更多详细信息,请参见功能概述。 在目标冲突的情况下,具有较高重要性的目标应优先。
chromium-linux.zip
SwitchyOmega-Chromium
该文件属于Chromium 58版本的编译配置文档,其中,包含每一项参数的说明。 请注意,该文档是通过gn args --list out/debug生成的,如果你已下载Chromium源码,可以手动生成,不必下载。
chromium离线安装版49 x86 32位windows xp 2003 亲测好用.chromium 不会默认上传您的用户数据,且性能比同版本chrome强10%。差不多可以说算得上是xp 2003 下最好用的 浏览器了
SwitchyOmega_Chromium插件
LICENSES.chromium
Chromium Nightly Updater 1.1
断断续续下载chromium代码花了1周左右,代码约15G左右,其中遇到power shell的问题,遇到python的问题。最终编译花了11:30分。相比于Linux下的编译慢很多,系统运行的稳定性和速度也差很多。打算研究源码,一起分享...
C#写的Chromium核心的简单多标签浏览器源码,编译成功后把dll文件夹里面的文件复制到运行目录即可,浏览器核心版本号Chromium 43.0.2357.130
SwitchyOmega_Chromium.crx
Chromium网页渲染技术,更多信息点击进入:http://0xcc0xcd.com
Chromium图形栈在2014年有多项改进,在图形性能和资源消耗方面做了进一步提升,例如ubercompositor的使用,GPU加速的光栅化,零拷贝(zero-copy)的支持,Android WebView的渲染模型改进等。这个幻灯片尝试列举...
Chromium浏览器官方版是一个由Google主导开发的网页浏览器,Chromium浏览器官方版是Google为发展Google Chrome而开启的计划,所以Chromium浏览器相当于Chrome的工程版或称实验版,新功能会率先在Chromium上实现,待...
chromium开发教程.docx
Chromium离线安装包,适用于树莓派。我的博客中有教程。
chromium的media模块代码,主要用于学习播放器的架构,学学chromium的播放引擎架构