zoukankan      html  css  js  c++  java
  • 浏览器-02 Chromium的多线程

    Chromium 的多线程机制

    概述

    • 每个进程都有很多的线程;

    • 多线程主要是为了保证UI线程(chrome 线程,主线程)不会被任何其它费时的操作阻碍而影响对用户的响应;

    • 为了解决多线程通信和同步问题,Chromium的机制是绝大多数的场景使用事件和一种chromium新创建的任务传递机制,仅在非用不可的情况下使用锁或者线程安全对象,这有严格的要求;

    • Chromium在每个线程内部通过MessageLoop如何处理事件和任务;

    • 几个重要和诡异的线程:
      * 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的接口来负责处理自定义任务;

    无限循环

    • 消息循环本质就是一个无限循环,不停的处理消息循环接收到的任务和消息,直到需要推出为止;
    • 等待自定义的任务, 以MessagePumpLibEvent为例:在Linux平台上, 该类创建一个管道,它等待读取这个管道的内容,当有自定义的新任务到来时,写入一个字节到这个管道,从而MessageLoop被唤醒;
  • 相关阅读:
    【转发】淘宝下单高并发解决方案
    ImageLoader的使用
    学习写接口回调
    EventBus的使用
    ListView显示多种类型的item
    GridView规则显示图片
    ViewPager滑动标签-PagerSlidingTabStrip的使用
    Json解析要点
    LISTVIEW嵌套GRIDVIEW的一些处理(点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置)(对这篇文章的优化处理,不每次都new onItemClickListener)
    SVN分支的创建,合并,与销毁和相关操作
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/5035968.html
Copyright © 2011-2022 走看看