博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浏览器-02 Chromium的多线程
阅读量:4984 次
发布时间:2019-06-12

本文共 1362 字,大约阅读时间需要 4 分钟。

Chromium 的多线程机制

概述

  • 每个进程都有很多的线程;
    676883-20151210151707043-944297880.png
  • 多线程主要是为了保证UI线程(chrome 线程,主线程)不会被任何其它费时的操作阻碍而影响对用户的响应;
  • 为了解决多线程通信和同步问题,Chromium的机制是绝大多数的场景使用事件和一种chromium新创建的任务传递机制,仅在非用不可的情况下使用锁或者线程安全对象,这有严格的要求;
  • Chromium在每个线程内部通过MessageLoop如何处理事件和任务;

    676883-20151210152431480-1286624556.png

  • 几个重要和诡异的线程:

    * chrome线程:进程的主线程,browser进程中主要是负责 UI,当然也是管家;Renderer进程中则是管家兼处理WebKit渲染;gpu进程中则是负责处理绘图请求并调用openGL进行绘制工作。
    * Chrome_IOThread/Chrome_ChildIOThread线程:用来接受来自其它进程的IPC消息和派发自身消息到其它进程;
    * SignalSender线程: V8 JavaScript引擎中用于处理Linux信号的线程;

任务

  • Chromium的特色就是在事件的基础上,加入了新的机制-任务;当要执行某个操作时,把该操作封装成一个任务,由任务派发机制传递给相应的进程的 MessageLoop;
  • 线程内部的进行:
    * 当需要进行费时的操作时候,派发一个事件和回调函数给自身线程的MessageLoop,然后MessageLoop会调度该回调函数以执行其操作;
    * 线程间通信: 假如一个线程A需要把任务传递给一个另外的线程B, 首先,A把任务传递给B;其次,B调度执行该任务;最后,B执行完任务后回复A;很多情况下,线程A不需要回复。

消息循环

  • Chromium里,需要处理三种类型的消息:
    * chromium自定义的任务; //平台无关
    * Socket或者文件等IO操作; //平台相关
    * 用户界面(UI)的消息; //平台相关
  • 典型线程例子
    * 主线程(UI线程)需要处理UI相关的消息和自定义任务;
    * IO线程则需要处理Socket和自定义任务;
    * History线程则只需要处理自定义任务;
    * 其它线程需要处理消息类型不会超出以上三个线程;

Chromium中主要的类

  • RunLoop:一个辅助类,主要封装消息循环MessageLoop类,主要提供一组公共接口被调用,实质是调用MessageLoop类的接口和实现;
  • MessagePump: 一个抽象出来的基类,可以用来处理第二和第三种消息类型;对于每个平台,它们有不同的子类来对应;
  • MessageLoop:主消息循环,原理上讲,应该可以处理三种类型的消息,实际上通过实现MessagePumpDelegate的接口来负责处理自定义任务;
    676883-20151210170611933-31542679.png

无限循环

  • 消息循环本质就是一个无限循环,不停的处理消息循环接收到的任务和消息,直到需要推出为止;
  • 等待自定义的任务, 以MessagePumpLibEvent为例:在Linux平台上, 该类创建一个管道,它等待读取这个管道的内容,当有自定义的新任务到来时,写入一个字节到这个管道,从而MessageLoop被唤醒;

转载于:https://www.cnblogs.com/jinkspeng/p/5035968.html

你可能感兴趣的文章
pgsql 服务遇见的问题记录
查看>>
数据库练习题
查看>>
软件工程过程 第4章 瀑布模型应用实例
查看>>
Tomcat启动Creation of SecureRandom instance卡住解决办法
查看>>
poj 2000 Gold Coins
查看>>
开通博客了
查看>>
BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )
查看>>
try catch
查看>>
slf4j
查看>>
C#语言和SQL Server数据库技术_程序数据集散地:数据库
查看>>
ES6学习之变量的解构赋值
查看>>
PHP 生成图片缩略图函数
查看>>
Boost Bimap示例
查看>>
ESLint 使用入门
查看>>
流水作业调度
查看>>
涨姿势系列之——内核环境下内存映射函数
查看>>
遍历数组批量更新数组里元素的某一项属性
查看>>
github 收藏项目的方法
查看>>
九的余数
查看>>
北京师范大学第十五届ACM决赛-重现赛K Keep In Line ( 字符串模拟实现)
查看>>