zoukankan      html  css  js  c++  java
  • CEF3开发者系列之进程和线程

    CEF3是一个多进程架构框架,如果有了解过chromium的进程架构的,那么就很容易了解CEF3的多进程了。打开CEF3源代码中发布的cefclient实例,如果打开的页面带有flash或者其他插件。在任务管理其中可以看到四个进程,显示出命令行列。可以看到一个主进程,一般主进程是Browser进程,其他的分别是渲染进程(Render),GPU加速进程(GPU),插件进程(NPAPI或者PPAPI)。

    Browser进程:被定义为主进程,负责窗口管理,界面绘制和网络交互。

    Render 进程:Blink的渲染和js的执行被放在一个独立的Render 进程中;除此之外,Render进程还负责Js Binding和对Dom节点的访问。 默认的进程模型中,会为每个标签页创建一个新的Render进程。

    NPAPI插件进程:按需创建,每种类型的插件只会有一个进程,每个插件进程可以被多个Render进程共享;

    Pepper插件进程:同NPAPI插件进程,不同的是为Pepper插件而创建的进程;

    GPU进程:按需创建,最多只有一个,当且仅当GPU硬件加速打开的时候才会被创建,主要用于对3D加速调用的实现。

      多进程的好处很多,在浏览器中最主要的好处是当一个页面或者插件崩溃或假死,不会给其他页面带来影响。CEF3的进程之间可以通过IPC进行通信。Browser和Render进程可以通过发送异步消息进行双向通信。甚至在Render进程可以注册在Browser进程响应的异步JavaScript API。在CEF3中,Browser和Render进程间可以通过SendProcessMessage(CefProcessId target_process,  CefRefPtr<CefProcessMessage> message)函数实现消息传递。

      默认情况下,主应用程序会被多次启动运行各自独立的进程。通过传递不同的命令行参数给CefExecuteProcess函数实现的。如果主应用程序很大,加载时间比较长,或者不能在非浏览器进程里使用,则宿主程序可使用独立的可执行文件去运行这些进程。这可以通过配置 CefSettings.browser_subprocess_path变量做到。更

      chromium本身支持多种进程模型,但CEF3主要是模型是两种:单进程和为每个标签创建一个进程。后一种是缺省行为,前边一种可设置。通过设置命令行的--single-process,CEF3就可以支持用于调试目的的单进程运行模型。支持的平台为:Windows,Mac OS X 和Linux

      一图解千语,下图给出了缺省的chromium浏览器的进程模型。方框代表进程,连接线代表IPC进程间通信。

     

      由于关于cef3进程架构的讲解很少,个人猜测CEF3的进程架构和chromium应该差不多,毕竟CEF3是基于chromium的框架。更多和进程相关的内容可以网上搜索“chromium多进程架构”。

      在CEF3中,每个进程都会运行多个线程。完整的线程类型表请参照cef_thread_id_t

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    typedef enum {
    // BROWSER PROCESS THREADS -- Only available in the browser process.
     
      ///
      // The main thread in the browser. This will be the same as the main
      // application thread if CefInitialize() is called with a
      // CefSettings.multi_threaded_message_loop value of false.
      ///
      TID_UI,
     
      
     
      // Used to interact with the database.
      TID_DB,
     
      ///
      // Used to interact with the file system.
      ///
      TID_FILE,
     
      // Used for file system operations that block user interactions.
      // Responsiveness of this thread affects users.
      TID_FILE_USER_BLOCKING,
     
      ///
      // Used to launch and terminate browser processes.
      ///
      TID_PROCESS_LAUNCHER,
     
      // Used to handle slow HTTP cache operations.
      TID_CACHE,
     
      // Used to process IPC and network messages.
      TID_IO,
     
    // RENDER PROCESS THREADS -- Only available in the render process.
     
      ///
      // The main thread in the renderer. Used for all WebKit and V8 interaction.
      ///
      TID_RENDERER,
    } cef_thread_id_t;

    在Browser进程中包含如下主要的线程:

      • TID_UI 线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程。
      • TID_IO 线程主要负责处理IPC消息以及网络通信。
      • TID_FILE 线程负责与文件系统交互。

    由于CEF采用多线程架构,有必要使用锁和闭包来保证数据的线程安全语义。IMPLEMENT_LOCKING定义提供了Lock()和 Unlock()方法以及AutoLock对象来保证不同代码块同步访问数据。CefPostTask函数组支持简易的线程间异步消息传递。更多信息,请参考Posting Tasks章节。

    可以通过CefCurrentlyOn()方法判断当前所在的线程环境,cefclient工程使用下面的定义来确保方法在期望的线程中被执行。

    #define REQUIRE_UI_THREAD()   ASSERT(CefCurrentlyOn(TID_UI));
    #define REQUIRE_IO_THREAD()   ASSERT(CefCurrentlyOn(TID_IO));
    #define REQUIRE_FILE_THREAD() ASSERT(CefCurrentlyOn(TID_FILE));

  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/7049049.html
Copyright © 2011-2022 走看看