介绍Chromium的多进程架构

为什么引入多进程架构?


在Chromium引入多进程架构之前,当前流行的浏览器都采用单进程实现,例如FireFox,IE,Safair等,浏览器所有的标签页都运行在同一个进程中,当某个标签页崩溃时(可能由于渲染引擎的缺陷或者网页的恶意攻击等原因),就会导致整个浏览器崩溃。此时其他运行正常的标签页也随着浏览器的崩溃而被强行关闭,标签页中未保存的数据也就自然丢失了。随着浏览器功能越来越丰富,比如Chrome浏览器已经发展成为一个píng台,有自己的应用商店,用户可以在线安装应用,将近可以比拟成一个操作系统。现在流行的操作系统越来越具有鲁棒xìng,因为每个程序都运行在自己独立的地址空间,一个进程不能直接访问其他进程的数据,进程之间不会相互干扰,某个程序的崩溃当然也就不会影响到其他的进程。其实浏览器也存在这样的需求,因为用户也不想看到由于某个标签页的漏洞,导致整个浏览器的奔溃。基于上述原因,Chromium采用了多进程架构,除了让每个标签页运行在自己独立的地址空间之外,也可以控制这些标签页对操作系统资源的访问,也确保了安全xìng。

架构概述


为了保证鲁棒xìng和安全xìng,Chromium采用了多进程架构,为标签页分配单独的进程,我们称这些进程为渲染进程(Renderer Process),在渲染进程中使用WebKit引擎(现在是Blink)来解析HTML和网页的排版布局和渲染。但是这些进程运行在一个沙盒中,它们只具有受限的访问系统资源的能力,比如说网络资源,文件系统等。如果这些渲染进程需要访问这些系统资源,就只能通过另外一个进程获取,该进程就是浏览器进程(Browser Process),浏览器进程是Chromium浏览器中的总管,他负责分配和管理其他所有的进程,例如渲染进程,Plugin进程,GPU进程等。除了浏览器进程之外,其他所有进程的终止都不会导致浏览器的崩溃。另外,我们看到的浏览器UI界面都是运行在浏览器进程中,这里可能有人提问,浏览器进程负责这么多任务(UI界面的响应,其他进程的进程间通信和访问网络文件等系统资源)会不会影响UI响应的速度?这里就要提到浏览器进程中的多线程了,其实在浏览器中存在许多线程,比如UI线程(主线程),IO线程,File线程等,详细内容可以参看另外一篇博文http://blog.csdn.net/yl02520/article/details/17007933 
总体架构图如下: 


管理渲染进程


每个渲染进程都存在一个RenderProcess对象,该对象负责与父进程(浏览器进程)进程进行通信,并且维hù进程的全局对象。浏览器进程也会为每个渲染进程分配一个相对应的RenderProcessHost,该对象负责和渲染进程中的RenderProcess对象进行通信。

管理视图(Views)


每个渲染进程都存在一个或多个RenderView对象,他们对应于我们在浏览器界面上看到的标签页,所以在上面我们概括的讲每个标签页都会分配一个进程其实是不准确的,只是一般情况是这样,关于标签页和渲染进程的关系,我们将在后续的Chromium进程模型中分析,这里就不深入讲解。这些RenderView对象被RenderProcess对象统一管理,为了与其他RenderView对象相区分,每个对象都会分配一个唯一的视图ID。另外在浏览器进程中也存在与RenderView相对应的RenderViewHost对象,这些对象由与RenderView对应的RenderProcessHost对象统一管理。现在假设浏览器也给某个具体的标签页发送消息时,消息的流程如下RenderViewHost ---> RenderProcessHost ---> RenderProcess---> RenderView. 其中在RenderProcessHost与RenderProcess之间是进程间通信(IPC).

组件和接口


在渲染进程中: 
每个渲染进程有且只有一个RenderProcess对象,该对象负责与浏览器进程中对应的RenderProcessHost对象进程进程间通信。 
在渲染进程中可能存在一个或多个RenderView对象,该对象可能代表一个标签页或者一个弹出对话框。 
在浏览器进程中: 
Browser对象代表最上层的浏览器窗口。 
RenderProcessHost对象存在于浏览器进程中,负责与渲染进程进行进程间通信,每存在一个渲染进程都在浏览器进程中存在一个与之对应的RenderProcessHost对象。 
RenderViewHost对象封装了与渲染进程中RenderView对象的进程间通信。

共享渲染进程


总体上来说,当用户打开一个新的网页时,浏览器就分配一个新的渲染进程,并在渲染进程中创建一个RenderView对象。 
但是有时必须在多个标签页中共享一个渲染进程,例如当一个Web应用通过javascript语句window.open() 打开了一个新的网页窗口时,那么原来的web应用可能期望与新创建的窗口发送消息,来控制新窗口的位置等,常见的应用比如说新浪主页上漂浮的小广告。这时我们就需要让这两个窗口或标签页共享一个渲染进程。另外,由于为每个标签页都新开一个渲染进程,势必会对系统的内存造成极大的消耗,当内存消耗到一定程度时或者内存吃紧时,就需要把新打开的标签页加入到某些已存在的渲染进程中。关于共享渲染进程更多的细节,请参考http://www.chromium.org/developers/design-documents/process-models 
更多 

你可能感兴趣的:(介绍Chromium的多进程架构)