Chrome内核解析 -- 背景篇:Chromium的多进程多线程构架

来源:互联网 发布:ih5 知乎 编辑:程序博客网 时间:2024/04/30 11:16

转载请注明出处:http://blog.csdn.net/yunchao_he/article/details/41695497


Chromium采用多进程构架,以Desktop Chromium为例,它包括一个Browser Process(也称为UI Process), 一个或多个Render Process(也称为Web Process), 零个或一个GPU Process, 以及一个或多个NPAPI Plugin Process, 一个或多个Pepper Plugin Process. 

也就是说,当你用Chrome浏览器打开多个网站(比如同时打开网易,人人网,bbs,淘宝),且每个网站可能对应多个tab(比如网易打开了一则头条,一则财经新闻,一则体育新闻,而淘宝则打开多个购物窗口买衣服,从而进行对比),这时系统对应着一个Browser进程,以及(默认情况下)多个Render进程,可能还有一个GPU进程,以及数量不等的plugin进程。这可以通过相应的工具查看,比如Windows下的任务管理器。

而各进程可能包含多个线程,比如Browser 进程包括主线程,compositor线程,I/O线程,一个或多个资源下载线程,文件操作线程,等等众多线程。其中主线程负责发起网络请求,调用Render进程开始解析HTML和执行JS,接收并响应用户操作(比如用户拖动滚动条)等等。compositor线程负责将网页内容和浏览器的窗口部件进行合成,从而形成最终要显示的像素。

Render进程则包括主线程,compositor线程,raster线程等。其中,主线程负责执行Javascript, 解析HTML/CSS, 完成绘制或者发起raster线程进行绘制,发起compositor线程等。compositor线程负责将网页的各个Layer进行合成。而raster线程负责完成某个layer或者某些块(tile)的绘制。

多进程构架的好处是显而易见的,一方面各进程、各线程协同工作可充分利用多核特性,以提高运行效率或响应速度。另一方面,进程分离可最大限度防止因访问某个网站而崩溃导致整个浏览器崩溃。这样,用户在其它网站上编辑而未提交的文件或其它操作不会因此丢失。

另外,Render进程的多少,可以在启动Chrome时进行配置,相关的命令行参数有--process-per-site-instance, --process-per-site, --process-per-tab, --single-process等等。通过这些参数,可以让同一个域名的多个tab共享同一个render进程(比如上文提到的打开网易的多条新闻,或多个淘宝购物窗口),或者每个tab都单独占用一个render 进程,或者所有域名均共享一个render进程。

各进程间采用Chromium IPC通信机制,具体可参考http://www.chromium.org/developers/design-documents/inter-process-communication。关于Chrome的多进程构架,可参考http://www.chromium.org/developers/design-documents/multi-process-architecture。而如何通过命令行参数设置render进程的共享行为,可参考http://www.chromium.org/developers/design-documents/process-models

原创粉丝点击