三九宝宝网宝宝百科宝宝知识

chrome源码解析系列:chrome线程体系

11月11日 编辑 39baobao.com

[线程的创建与终止方法和代码]DWORD WINAPI Thread(LPVOID lpParam) { while(TRUE) { printf("Thread1\n"); ::Sleep(500); printf("Thread2\n"); ::Sleep(500); printf("Thread3\n"); ::Sleep(500); pri...+阅读

那么现在将要深入BrowerProcess和 RenderProces里面去,揭开里面有多少线程,线程间怎样交互。

考试大提示现有问题:

BrowerProcess中有UI显示部分,消息接受部分,页面下载部分,然后其他一系列读取COOKIE,写文件,读写数据库,等操作是怎么协调?怎么分工的?之间又是怎么交互的?

RenderProces中渲染部分和接收 BrowerProcess消息部分是怎么交互的?

RenderProces是怎么发送消息的到BrowerProcess中的?

注意为了方便理解这里先还是先抛开PluginProcess和sanbox不讲。

按照上面的问题本章打算分三部分介绍:

一:BrowerProcess 中的线程

二:RenderProces中的线程

三:BrowerProcess和RenderProces线程交互流程。

一:BrowerProcess 中的线程

BrowerProcess里面的线程很多,其中最重要的是IO线程和UI线程。除了这两个线程,还有管理数据库读写的DB线程,管理本地文件读写的FILE线程等等。

要研究每个线程首先我们得了解每个线程的职能。

UI线程顾名思义,管理UI以及UI的消息循环,但是IO线程不能太顾名思义了,IO线程主要有两方面的职能,接收进程间消息(包括渲染进程和插件进程的消息),还有个职能是接收网络消息所有页面的下载的消息也由这个线程处理转发,不过除了用IO来表示这个线程也想不出来更好的名字了J。

可以先参看下 How Chromium Displays Web Pages 上面的介绍,先引用一张上面的图片:(BrowerProcess基本的线程结构)

一个页面是怎样被创建的呢?

先弄清楚下面几点说明:

1:一个BrowerProcess里面保存一个Browser的列表,每个Browser对象代表着一个浏览器窗口。

2:每个Browser对象里面保存一个WebContents列表(这个列表是用了一个TabStripModel的对象来封装),WebContents就是浏览器上面的HTML页面和标签。

3:每个WebContents中包含了一个RenderViewHost对象。这里要多介绍一下WebContents和RenderViewHost各自的功能:RenderViewHost主要表现的就是一个HTML页面,WebContents不说大家可能也已经猜到了,它就是管理标签命令和导航命令的(HTML页面以外的消息由它处理)。

讲一些题外话,GOOGLE声明说他们会在将来支持其他程序调用RenderViewHost的功能,这对微软来说是个相当打的挑战,虽然说瘦死的骆驼比马大,但是GOOGLE会一步步地同食微软的市场,这匹瘦骆驼也无力于健壮的马来竞争,IE只是他们计划中的一个小计划,闲话不多扯了,杀回来继续。

4:每个RenderViewHost被创建的时候它会创建一个RenderProcessHost的对象,并且创建一个Rander进程,RenderProcessHost的对象会等待Rander进程的连接消息。

5:一个RenderProcessHost对象会创建一个ChannelProxy的代理对象(这个对象将被分配到IO线程里面去运行),ChannelProxy对象的职责是转发Render进程的消息和网络消息(页面下载),并且把需要网络消息转发给Render进程。RenderProcessHost对象还会创建另外一个过滤消息的对象ResourceMessageFilter的过滤器,该过滤器会被添加到ChannelProxy中,此处也是采用上面重复提到的委托伎俩,ChannelProxy有个过滤消息的委托接口类,然后把消息交给由外面派生类(ResourceMessageFilter)来处理,如果处理了那么就不转发消息给UI线程了,如果没处理,那么转发消息。

6:每个ChannelProxy里面会包含一个真正的IPC::Channel对象,如果看过我上一篇文章的同学肯定还记的这个IPC::Channel,不就是进行进程间通讯的东东吗。Channel会把接受到的消息转发给ChannelProxy,由ChannelProxy决定该消息路由到什么地方。另外一点就是ChannelProxy会收到本进程的消息(网络消息和UI消息和其他的消息),这些消息会根据情况被转发给Render进程。

ChannelProxy在IO线程中是怎么把Message转换为Task的呢?

可能很奇怪,Message和Task都都好像在前面见过,考试大提示他们之间有什么关系呢?

Message是从Render进程那儿接受到的消息,TASK是消息循环中执行的一个任务,IO线程需要把Message转换为TASK发送到UI线程中去执行,Chrome开发人员定义了一套NewRunnableMethod 的方法,用来把Message转换为相应的TASK,参看base\task.h代码。ChannelProxy里面保存了UI的消息循环对象的指针,然后通过该对象PostTask系列函数来发送消息到UI线程中。

一个对BrowerProcess里面的进程大概介绍就这样完成了,对上面的6点我们还可以总结出 1,2,3是在UI线程环境中运行的,4,5是在IO线程中运行的,6是IO和UI线程之间交互方式

推荐阅读
图文推荐