设为首页 加入收藏

TOP

chrome源码解析系列:chrome线程体系
2014-11-23 21:52:19 】 浏览:667
Tags:chrome 源码 解析 系列 :chrome 线程 体系

  那么现在将要深入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线程之间交互方式。来源:考


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇调试OCX控件的DllRegisterServer.. 下一篇C++辅导:C++函数虚函数功能失效?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目