Chrome源代码分析之线程模型(十一)
2013-04-27 16:44
302 查看
Chrome的主进程和Renderer进程都创建了多个线程为自己服务。前面已经提到过,主进程主要包括下面几个线程:
ui线程,也就是主线程,主要用于响应系统消息和界面上来自用户的各种输入消息。
I/O线程,看名字就知道,主要处理网络通信的线程,进程间通信因为采用的是命名管道,也算在I/O里面,统一由该线程负责。
file线程,负责关于文件系统的各种操作的线程。
db线程,处理数据库方面的事务。
另外还有几个组件有自己的线程,比如历史记录,代理,自动化代理等。
谷歌重点提到,为了提高用户体验,需要经可能的保持UI线程的及时响应能力,这就要求不能有一些阻塞的I/O或者其他费时的操作造成UI线程的阻塞。因此Chromet通过消息的传递来实现进程间的通信,而不是通常的做法:给线程加锁。同时也不建议用加锁的方式来实现对象的线程安全,而是让对象运行在某一个线程上。另外,所有的跨线程请求使用回调函数接口,这也是通过消息传递来实现的。
Chrome所有线程使用的是同一个线程模型,因此所有线程类继承自同一个基类,定义在文件:
src\base\base\thread.h中。
每个线程都有自己的消息循环对象,用来处理传递给线程的消息。消息循环类定MessageLoop的定义在:
src\base\message_loop.cc。
不同的线程包含不同的消息循环,在message_loop.h文件中定于了3种消息循环:
enum Type {
TYPE_DEFAULT,
TYPE_UI,
TYPE_IO
};
不管什么消息循环,均定义在MessageLoop类里面,在初始化的时候通过构造函数的参数传递一个类型进去。在构造函数中,根据不同的类型,会创建一个继承自MessagePumpWin类的子类。分别是MessagePumpForUI,MessagePumpForIO,MessagePumpDefault。每个MessageLoop有一个scoped_refptr<base::MessagePump> pump_的成员,用来保存MessageLoop所对应的MessagePumpWin。不同的消息循环包含了不同的MessagePumpWin,这是区分不同消息循环的关键。
在看看Thread类,Thread类的作用是管理MessageLoop,首先确定属于自己的MessageLoop,但MessageLoop的初始化并不是由Thread来完成。在必要的时候启动这个MessageLoop,并在需要的时候关闭这个MessageLoop。
ui线程,也就是主线程,主要用于响应系统消息和界面上来自用户的各种输入消息。
I/O线程,看名字就知道,主要处理网络通信的线程,进程间通信因为采用的是命名管道,也算在I/O里面,统一由该线程负责。
file线程,负责关于文件系统的各种操作的线程。
db线程,处理数据库方面的事务。
另外还有几个组件有自己的线程,比如历史记录,代理,自动化代理等。
谷歌重点提到,为了提高用户体验,需要经可能的保持UI线程的及时响应能力,这就要求不能有一些阻塞的I/O或者其他费时的操作造成UI线程的阻塞。因此Chromet通过消息的传递来实现进程间的通信,而不是通常的做法:给线程加锁。同时也不建议用加锁的方式来实现对象的线程安全,而是让对象运行在某一个线程上。另外,所有的跨线程请求使用回调函数接口,这也是通过消息传递来实现的。
Chrome所有线程使用的是同一个线程模型,因此所有线程类继承自同一个基类,定义在文件:
src\base\base\thread.h中。
每个线程都有自己的消息循环对象,用来处理传递给线程的消息。消息循环类定MessageLoop的定义在:
src\base\message_loop.cc。
不同的线程包含不同的消息循环,在message_loop.h文件中定于了3种消息循环:
enum Type {
TYPE_DEFAULT,
TYPE_UI,
TYPE_IO
};
不管什么消息循环,均定义在MessageLoop类里面,在初始化的时候通过构造函数的参数传递一个类型进去。在构造函数中,根据不同的类型,会创建一个继承自MessagePumpWin类的子类。分别是MessagePumpForUI,MessagePumpForIO,MessagePumpDefault。每个MessageLoop有一个scoped_refptr<base::MessagePump> pump_的成员,用来保存MessageLoop所对应的MessagePumpWin。不同的消息循环包含了不同的MessagePumpWin,这是区分不同消息循环的关键。
在看看Thread类,Thread类的作用是管理MessageLoop,首先确定属于自己的MessageLoop,但MessageLoop的初始化并不是由Thread来完成。在必要的时候启动这个MessageLoop,并在需要的时候关闭这个MessageLoop。
相关文章推荐
- Chrome源代码分析之进程和线程模型(三)
- Chrome源代码分析之线程模型续(十二)
- Chrome源代码分析之进程模型(八)
- tomcat的NIO线程模型源码分析
- memcached结构分析(一)——线程模型
- Android系统Surface机制的SurfaceFlinger服务的线程模型分析
- Android应用程序线程消息循环模型分析(6)
- Chrome线程模型(编译)
- Storm系列(十一)架构分析之Supervisor-管理Worker进程的事件线程
- Memcached源码分析(线程模型)
- ACE_TP_Reactor 实现 Leader-Follower 线程模型分析
- 【Netty源码分析】Reactor线程模型
- ZMQ源码分析(二)-- 网络&线程模型
- Android系统Surface机制的SurfaceFlinger服务的线程模型分析
- Memcached源码分析之线程模型
- quartz源码分析——执行引擎和线程模型
- CUDA 线程执行模型分析(一)招兵------ GPU的革命
- Chrome线程模型(编译)
- Android系统Surface机制的SurfaceFlinger服务的线程模型分析
- Android应用程序线程消息循环模型分析(1)