现在的位置: 首页 > 综合 > 正文

chrome源码解析系列:chrome 线程体系(1)

2013年09月26日 ⁄ 综合 ⁄ 共 2518字 ⁄ 字号 评论关闭

 上一章对chrome进程间通讯做了一个简单的介绍,利用name piples来传递二进制数据,Chrome把name piples封装在一个channel的类中,利用参数Message相互发送消息。

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

现在有有一下的问题:

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

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

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

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

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

一:BrowerProcess 中的线程

二:RenderProces中的线程

三:BrowerProcess和RenderProces线程交互流程

一:BrowerProcess 中的线程

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

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

UI线程顾名思义,管理UI以及UI的消息循环,但是IO线程不能太顾名思义了,IO线程主要有两方面的职能,接收进程间消息(包括渲染进程和插件进程的消息),还有个职能是接收网络消息所有HTTP页面的下载的消息也由这个线程处理转发,不过除了用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进程的消息和网络消息(HTTP页面下载),并且把需要网络消息转发给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线程之间交互方式。

  

//================================飘逸的分割线===============// 

    

下一章将对RenderProces里面的线程做简单的介绍,有了BrowerProcess的介绍这就简单得多了:)


抱歉!评论已关闭.