• 为什么使用多线程?
  • Chrome的多线程模型主要解决什么问题?
  • 如何实现该问题的解决?

1. 解决问题

Chrome有很多线程,这是为了保持UI线程(主线程)的高响应度,防止被其他费时的操作阻碍从而影响用户体验。但是多线程会造成资源并发访问引起的死锁和竞争冲突等问题。

2.方法

Chrome的多线程模型为避免资源被并发访问,尽量减少锁的使用,通过消息循环和自定义任务机制解决了并发问题。对于任一个线程,都是启动一个消息循环,等待和执行消息队列中的消息或任务。Chrome将需要的操作封装入自定义的任务Task中,由任务派发机制将Task传递给相应线程去执行,也只有在Task加入任务队列时需要加锁。线程之间数据传递也是通过封装Task进行通信。

3. 消息循环

Chrome中的主要线程根据其负责事务分为三类:

  • 普通线程:只能执行Task,没有其他的功能。
  • UI线程(也叫chrome线程):所有的窗口都需要跑在UI线程上,它除了能执行Task以外,还能执行和界面相关(UI)的消息循环。
  • IO线程:和本地文件读写,或者网络收发相关的操作都运行在这个线程上,它除了能执行Task以外,还能执行和IO操作相关的事件回调。

结构:这三种线程处理的消息也可以相应分为三类:只处理Task,处理Task和UI消息,处理Task和IO消息。分别定义三个类来实现对消息的处理。其中MessageLoop作为基类处理Task,由它派生出来的两个类MessageLoopforUI和MessageLoopforIO分别处理另外两种消息类型以及相关平台信息(UI消息和IO操作是平台相关的)。为了结构清晰,定义一个新的基类及其子类来负责处理消息,这就是MessagePump。MessagePump的每个子类针对不同平台和不同的消息类型。事实上,不仅如此,消息处理的主循环也在MessagePump中。因此,MessageLoop通过实现MessagePumpDelegate的接口来负责处理自定义任务。

过程:消息处理的主循环在MessagePump中。消息循环开始,通过RunLoop接口调用MessageLoop,MessageLoop通过MessagePumpDelegate(消息代表)调用MessagePump,从MessagePump开始处理消息,对工作队列中的任务,根据其优先级分别执行(Work,DelayWork,IdleWork),处理完后判断是否还有待处理的任务,有则继续新一轮循环,无则暂停等待唤醒。(消息等待:对于IO消息等有OS提供支持,对于自定义的Task,则通过建立管道,在Task到来时写入一个字节从而唤醒消息循环?)

*待修改

【未整理】延时任务(延迟延迟任务队列和需在顶层执行的延迟任务队列),输入队列和工作队列(任务复制)

4. Task

为了统一所有消息循环中的任务调用方式,所有的任务的基类都是这个Task类,他唯一的方法就是run(),MessageLoop只需要调用这个虚函数即可。如果为了简化开发,光是一个Task,就提供了各式各样的派生类。

  • 它提供了一大套的模板封装(参见task.h),可以将Task摆脱继承结构、函数名、函数参数等限制。
  • 派生出来的Task有:CancalableTask,ReleaseTask,QuitTask等等。
  • 在消息循环中,根据不同的应用场景,将Task又分为即时处理的Task、延时处理的Task和Idle时处理的Task。
  • 为了简化开发,还引入了RunnableMethod,封装对象的方法,减少我们自己实现Task的时间。
  • 调用PostTask时,还需要传入一个tracked_objects::Tracked,Tracked是为了实现多线程环境下
    的日志记录、统计等功能,用于追踪Task的产生位置,为调试做准备,使得Task天生就有良好的可调试性和可统计性。

【未整理】Task在线程内创建,执行,抛出,加入,复制,销毁,…,的实现;

5.参考资料

Chrome多线程模型的更多相关文章

  1. Muduo 多线程模型对比

    本文主要对比Muduo多线程模型方案8 和方案9 . 方案8:reactor + thread pool ,有一个线程来充当reactor 接受连接分发事件,将要处理的事件分配给thread pool ...

  2. 【转载】COM的多线程模型

    原文:COM的多线程模型 COM的多线程模型是COM技术里头最难以理解的部分之一,很多书都有涉及但是都没有很好的讲清楚.很多新人都会在这里觉得很迷惑,google大神能搜到一篇vckbase上的文章, ...

  3. Oracle12c(12.1)中性能优化&功能增强之通过参数THREADED_EXECTION使用多线程模型

    1.   后台 UNIX/Linux系统上,oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle  15356  ...

  4. OS之进程管理---多线程模型和线程库(POSIX PTread)

    多线程简介 线程是CPU使用的基本单元,包括线程ID,程序计数器.寄存器组.各自的堆栈等,在相同线程组中,所有线程共享进程代码段,数据段和其他系统资源. 传统的的单线程模式是每一个进程只能单个控制线程 ...

  5. 第13章 TCP编程(4)_基于自定义协议的多线程模型

    7. 基于自定义协议的多线程模型 (1)服务端编程 ①主线程负责调用accept与客户端连接 ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问. ③服务端接到的客户端信息后,回显 ...

  6. Java NIO学习与记录(八): Reactor两种多线程模型的实现

    Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...

  7. 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑

    看到知乎上有个关于linux多进程.多线程的讨论:http://www.zhihu.com/question/19903801/answer/14842584 自己项目里也对这个问题有过很多探讨和测试 ...

  8. [源码分析] 分布式任务队列 Celery 多线程模型 之 子进程

    [源码分析] 分布式任务队列 Celery 多线程模型 之 子进程 目录 [源码分析] 分布式任务队列 Celery 多线程模型 之 子进程 0x00 摘要 0x01 前文回顾 1.1 基类作用 1. ...

  9. Redis 6.0 新特性:带你 100% 掌握多线程模型

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 码老湿,提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线程处理网络 IO: 客户端缓存 ...

随机推荐

  1. 常用Shell的路径

    #define REG_SHELL "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\S ...

  2. JSON操作技巧

    JSONObject.JSONArray 最近两个星期接触最多的就是json和map了. 之前用到的json,就是一个键对应一个值,超级简单的一对一关系.现在用到的json那可以层层嵌套啊,刚开始接触 ...

  3. (转)java性能调优

    本文转自:http://blog.csdn.net/lilu_leo/article/details/8115612 一.类和对象使用技巧 1.尽量少用new生成新对象 用new创建类的实例时,构造雨 ...

  4. Android权限安全(13)4.3前后root原理不同

    在JB MR2(4.3)之前 Apk内部可以通过Java的Runtime执行一个具有Root-setUID的可执行文件而 提升Effective UID来完成一些特权操作,典型的Root包中的su就是 ...

  5. C# 控件双缓冲控制 ControlStyles 枚举详解

    ControlStyles 枚举 .NET Framework 4    指定控件的样式和行为. 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合. 命名空间:  Sy ...

  6. linux中压缩与解压缩命令小结

    linux中压缩与解压操作非常常见,其命令参数也非常的多,这里只介绍最经常用的带打包文件的几种压缩和解压方式和几个最常用的参数. 现在最常用的压缩和解压工具是gzip和bzip2,这两种工具不能相互解 ...

  7. tc 2014 college tour 250 500

    题意: You are given a long long n. Return the largest divisor of n that is a perfect square. That is, ...

  8. hashmap的遍历

    import java.util.HashMap;import java.util.Iterator; public class hash { /** * @param args */ public ...

  9. voliecty indexOf的写法

    Velocity allows you to use all Java methods available in your objects. So just write as if it was Ja ...

  10. C#路径/文件/目录/I/O常见操作汇总<转载>

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...