chrome源码解析系列:chrome线程体系
现在,我们将深入到BrowerProcess和RenderProces中,找出其中有多少线程,以及它们如何相互交互。
考试提示存在的问题:
Brower进程中有UI显示部分、消息接受部分、HTTP页面下载部分,然后是读取COOKIE、写入文件、读写数据库等一系列其他操作。它们是如何协调的?分工如何?它们是如何相互作用的?
呈现过程中的呈现部分和接收BrowerProcess消息部分是如何交互的?
render procedures如何向BrowerProcess发送消息?
注意,为了便于理解,最好把PluginProcess和sanbox放在一边。
根据以上问题,本章拟分三部分介绍:
一:BrowerProcess中的线程
二:Render过程中的线程
三:BrowerProcess与Render过程的交互过程。
I:Brower Process中的线程
Brower Process中有很多线程,其中最重要的是IO线程和UI线程。除了这两个线程,还有管理数据库读写的DB线程,管理本地文件读写的FILE线程等等。
要研究每个线程,首先要了解每个线程的作用。
UI线程顾名思义,管理UI和UI的消息循环,但是IO线程不能太顾名思义。IO线程主要有两个功能,一个是接收进程间消息(包括渲染进程和插件进程的消息),另一个功能是接收网络消息。所有HTTP页面的下载消息也是由这个线程处理转发的,但是除了IO我想不出更好的名字来称呼这个线程。
可以先参考Chromium如何显示网页的介绍,先引用上面一个图片:
(Brower进程的基本线程结构)
页面是如何创建的?
首先明确以下说明:
1:一个BrowerProcess存储一个浏览器列表,每个Browser对象代表一个浏览器窗口。
2:每个Browser对象持有一个WebContents的列表(这个列表由一个TabStripModel对象封装),WebContents就是浏览器上的HTML页面和标签。
3:每个WebContents都包含一个RenderViewHost对象。这里我想多介绍一下WebContents和RenderViewHost各自的功能:RenderViewHost主要代表一个HTML页面。您可能已经猜到了,WebContents管理标记命令和导航命令(HTML页面以外的消息由它处理)。
说点题外话,GOOGLE声明他们以后会支持其他程序调用RenderViewHost的功能,这对微软来说是相当大的挑战。虽然都说瘦死的骆驼比马大,但是谷歌会一步步吃掉微软的市场,这种瘦死的骆驼是无法和强大的马来抗衡的。IE只是他们计划中的一个小计划,不要讲太多。杀了它继续。
4:每个RenderViewHost创建时,都会创建一个RenderProcessHost的对象和一个Rander进程。RenderProcessHost的对象将等待Rander进程的连接消息。
5:RenderProcessHost对象将创建ChannelProxy的代理对象(该对象将被分配给IO线程运行)。ChannelProxy对象的作用是转发渲染进程的消息和网络消息(HTTP页面下载),将需要的网络消息转发给渲染进程。RenderProcessHost对象还将创建另一个对象ResourceMessageFilter的过滤器,该过滤器将被添加到ChannelProxy。这里也采用了上述的委托伎俩。ChannelProxy有一个委托接口类,它过滤消息,然后将消息交给外部派生类(ResourceMessageFilter)进行处理。如果它被处理,它不会将消息转发给UI线程。如果它没有被处理,它将转发消息。
6:每个ChannelProxy将包含一个真正的IPC:: channel对象。如果看过我上一篇文章的同学一定记得这个IPC:: channel,不就是进程间通信的东西吗?Channel会将收到的消息转发给ChannelProxy,ChannelProxy将决定将消息路由到哪里。还有一点就是ChannelProxy会从这个进程接收消息(网络消息、UI消息等消息),这些消息会根据情况转发给渲染进程。
通道代理如何在IO线程中把消息转换成任务?
消息和任务似乎都见过面,这可能有点奇怪。他们之间是什么关系?
Message是从渲染进程收到的消息,TASK是在消息循环中执行的任务。IO线程需要将消息转换成任务,并发送给UI线程执行。Chrome开发者定义了一套NewRunnableMethod方法,将消息转换成相应的任务。见code base\task.h ChannelProxy存储指向UI的消息循环对象的指针,然后通过该对象的PostTask系列函数将消息发送给UI线程。
至此,对BrowerProcess中的过程的大致介绍就完成了。从以上六点我们也可以得出结论,1,2,3运行在UI线程环境中,4,5运行在IO线程中,6是IO和UI线程的交互
0条评论