• 为什么使用多线程?
  • 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. IDEA使用的点点滴滴

    查找一个类可以使用快捷键Ctrl + N 那么怎么看这个类中有哪些属性,哪些方法,就像Eclipse中的outline功能呢? 如查看NIO中的Buffer类,Ctrl + N-->

  2. *windows文件显示后缀名

  3. Django admin site(三)InlineModelAdmin

    InlineModelAdmin class InlineModelAdminclass TabularInlineclass StackedInline 举例,有两个Model: from djan ...

  4. C#实现Comparable接口实现排序

    C#中,实现排序的方法有两种,即实现Comparable或Comparer接口,下面简单介绍实现Comparable接口实现排序功能. 实现Comparable接口需要实现CompareTo(obje ...

  5. (一)CSS三种插入方式

    CSS概述 CSS(Cascading Style Sheets)指层叠样式表,样式定义了如何显示HTML元素. 样式通常存储在样式表中,样式与HTML分离解决了内容与表现分离的问题. 多个样式表可以 ...

  6. junit浅学笔记

    JUnit是一个回归测试框架(regression testing framework).Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(Wh ...

  7. [POJ1753]Flip Game(开关问题,枚举)

    题目链接:http://poj.org/problem?id=1753 和上一个题一样,将初始状态存成01矩阵,就可以用位运算优化了.黑色白色各来一遍 /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏ ...

  8. 1346. Intervals of Monotonicity(dp)

    1346 简单dp #include <iostream> #include<cstdio> #include<cstring> #include<algor ...

  9. SFMPQ打包工具完后小结

    硬盘上没有,第一次创建Archive的时候用SFileOpenArchiveForUpdate, 当打开一个已经存在archive的时候用SFileOpenArchive. MpqDeleteFile ...

  10. ZOJ 1610 Count the Colors (线段树 成段更新)

    题目链接 题意:成段染色,初始为0,每次改变一个区间的颜色,求最后每种颜色分别有多少段.颜色按照从 小到大输出. 分析:改变了代码的风格,因为看了学长的博客.直接用数组,可以只是记录节点的编号,因为节 ...