前面我们介绍过Chromium是基于多进程模型的架构设计,那么各个进程内的情况呢?事实是每个进程都有很多的线程,特别是browser进程,因而它也基于多线程模型的。介绍多线程机制之前,先来看一下残酷的现实吧,下面是各个进程的线程信息情况(基于Linux平台,其它平台的可能略有不同),相信保证让你头大。是的,你需要泡杯茶,然后静下心来了解一下它们:
为什么这么多的线程呢?Chromium的官方说法告诉我们,主要目的就是为了保持UI的高响应度,保证UI线程(chrome线程,主线程)不会被任何其它费时的操作阻碍从而影响了对用户的响应。这些其它的操作很多,例如本地文件读写,socket读写,数据库操作等等。既然它们会阻碍其它操作,那好,把它们放在单独的线程里自己忙或者等待去吧,所以你就看到那么多与这些相关的线程(线程名显然也暴露了这一切)。
问题来了,它们直接如何通信和同步呢?这是多线程的一个非常难缠的问题,因为这会造成死锁或者竞争冲突等问题。Chromium精心设计了一套机制来处理它们,那就是绝大多数的场景使用事件和一种chromium新创建的任务传递机制,仅在非用不可的情况下使用锁或者线程安全对象,这有严格的要求,详细的情况请查看以下链接以便作近一步的了解:http://www.chromium.org/developers/lock-and-condition-variable。
问题又来了,那么每个线程内部是如何处理这些事件和任务的呢?答案是MessageLoop。每个线程会有一个自己的MessageLoop,它们用来处理这些事件和任务。通常的MessageLoop只是处理事件,Chromium中的MessageLoop可以同时处理事件和任务。MessageLoop也是值得研究的,详细情况我们将在以后的一章加以介绍。
任务和MessageLoop的基本原理如下图所示。任务被派发到进程的某个线程的MessageLoop的队列中,MessageLoop会调度执行这些Task。
关于上面这些线程,多数可以通过它们的名字猜出用途,这里鉴于篇幅和噪音考虑,不一一介绍,下面说明几个重要和诡异的线程:
chrome线程:进程的主线程,browser进程重要主要是负责UI,当然也是管家;Renderer进程中则是管家兼处理WebKit渲染的;gpu进程中则是负责处理处理绘图请求并调用openGL进行绘制工作的。
Chrome_IOThread/Chrome_ChildIOThread线程:用来接受来自其它进程的IPC消息和派发自身消息到其它进程。
SignalSender线程: V8 JavaScript引擎中用于处理Linux信号的线程。
##任务(task)
Chromium的特色就是在事件的基础上,加入了一个新的机制-任务。当需要执行某个操作时候,可以把该操作封装成一个任务,由任务派发机制传递给相应的进程的MessageLoop。
下面看看线程内和线程间分别是如何操作的。
首先看线程内部是如何进行的。但你需要进行费时的操作时候,可以派发一个事件和回调函数给自身线程的MessageLoop,然后MessageLoop会调度该回调函数以执行其操作。问题是这有必要吗?直接调用不就可以吗?答案是不可以,或者说是最好不要这么做,其原因在于,如果当前的MessageLoop里面有优先级更高的事件和任务需要处理时,你这样做会阻碍它们的执行。
其次看一看线程间通信。假如一个线程A需要把任务传递给一个另外的线程B,大致有三个阶段:
1. 首先,线程A把该任务传递给线程B;
2. 其次,线程B调度执行该任务;
3. 最后,线程B执行完任务后回复A。很多情况下,线程A不需要回复。
下图描述的是一个带回复的典型的任务传递过程。
如果不需要回复,那么上图中的‘Reply Task2’就不需要了。当需要回复时候,chromium的做法是新建一个新的任务,该任务封装原来的任务,新任务被放入线程B,B执行新任务时候调用其Run方法,里面首先执行原来的任务,然后派发Reply任务给线程A,操作完成。
后面会有一个具体的例子来描述上面这个过程,下面了解一下chromium支持Task所涉及的几个主要类。
Callback: 回调类,其本质是封装了一个由调用者(例如线程A)设置的回调函数。包含一个run方法,当MessageLoop调度执行该Task时候,运行该方法,该方法调用回调函数
Closure: 定义为Callback<void(void)>
tracked_objects:一系列的类用于追踪Task生成位置,编译调试
Task: 包含一个Closure,追踪信息,表示一个任务
##一个例子
下面用一个实际的例子来理解线程间是如何传递任务的。该例子是chromium中非常常见的一个场景: browser进程接收到来自renderer进程的IPC消息,它由IO线程接收管理,然后派发给chrome线程处理,具体过程如下图所示:
上面的图基本上对应了前面的关于任务派发过程的图,只是少了回复环节,这是因为IO 线程并不需要回复。基本的步骤是,当IO线程收到消息后,其派发一个任务,该任务将ChannelProxy::Context::OnDispatchMessage设置会回调函数,这个任务保存在chrome线程的输入任务队列中。chrome线程将输入队列拷贝到工作队列后,执行该任务的run方法,该方法会调用回调函数ChannelProxy::Context::OnDispatchMessage,该函数会调用事件的处理函数,这里也就是RenderProcessHostImpl::OnMessageReceived,这个函数实际上会根据事件类型来调用各个相应函数。
## 源文件目录
base/threading/
线程相关的基础类
## 参考文献
1. http://www.chromium.org/developers/design-documents/threading
2. http://bigasp.com/archives/478
3. http://www.chromium.org/developers/lock-and-condition-variable
相关推荐
在Chromium项目中,消息循环(Message Loop)是其多线程编程模型的核心组成部分,它负责处理各种异步事件和消息。本示例将深入探讨Chromium的消息循环机制及其跨线程通信方式,以C++语言实现。首先,我们要了解...
总结,Chromium Base 的线程管理为开发者提供了一套强大且灵活的工具,通过剥离Base库并创建自己的项目,可以利用这些工具构建高效、安全的多线程应用。理解并熟练掌握这些概念和机制,对于任何涉及并发编程的项目都...
同时,它还支持多线程渲染和JavaScript异步执行,以提供更快的加载速度和流畅的用户体验。 不过,值得注意的是,Chromium并不包含一些Google Chrome的特有服务,例如Google同步功能,用户无法同步书签、密码、设置...
1. **多线程处理**:浏览器需要处理多个并发任务,如网络请求、渲染页面、JavaScript执行等,因此必须有效利用Java的并发工具,如线程池和锁机制。 2. **安全性**:Java和Chromium都强调安全性,开发过程中需要确保...
例如,通过分析`cc`(Compositor Component)模块,我们可以了解到Chromium如何分解和调度绘制任务,以及如何在不同线程间通信。同时,`gpu`模块展示了如何利用GPU进行硬件加速,包括OpenGL接口的封装和使用。 总结...
- 性能优化:通过硬件加速、多线程处理等技术提高渲染速度。 - 安全增强:加强隐私保护、防止XSS攻击等。 - 新API支持:如WebAssembly、WebGL等,提供更多元化的Web应用开发能力。 #### 第14篇 利用javascript和...
为了确保多线程环境下的安全性,Chromium还提供了一组线程安全的版本,包括 `RefCountedThreadSafeBase`、`RefCountedThreadSafe` 和 `DefaultRefCountedThreadSafeTraits`。这些类同样提供了线程安全的引用计数机制...
2. **多线程处理**: CEF是多线程的,需要确保在正确的线程上执行CEF相关的操作,以避免数据竞争和崩溃。 3. **通信机制**: CEF提供了一种称为“上下文对象”的机制,允许C++和JavaScript之间进行通信。通过这种方式...
在`zutils`中,许多函数和类都考虑到了多线程环境下的使用,采用了适当的同步机制,如锁、条件变量等,以确保在并发环境下正确地工作。这对于现代高性能计算和分布式系统来说至关重要。 **5. 编程工具集** `zutils`...
7. **多线程**:理解CEF中的线程模型很重要,避免在不合适的线程上执行操作,以防止线程安全问题。 8. **内存管理**:由于CEF是C++库,需要遵循C++的内存管理规则,确保正确释放分配的内存。 9. **更新策略**:CEF...
此外,CEF还支持多线程模型,使得复杂的UI更新和网络操作可以在后台线程中进行,避免阻塞用户界面。 为了充分利用这个压缩包,开发者需要了解CEF的API和Chromium的渲染机制。他们需要将CEF库与自己的应用程序链接,...
此外,Mojo 支持异步通信,允许在不同的线程或任务队列上执行方法回调,以保持主线程的响应性。 总之,Chromium Mojo 是 Chromium 项目中的关键组件,为复杂浏览器架构中的进程间通信提供了强大而灵活的工具。理解...
CefSharp提供了错误处理机制,你可以通过事件监听来处理这些问题。 **三、CefSharp的主要特性** 1. **多平台支持**:CefSharp不仅支持Windows,还支持Linux和macOS。 2. **JavaScript交互**:你可以通过`...
为了充分利用CEF,开发者应该熟悉Chromium的生命周期管理和多线程模型,因为CEF是基于Chromium的多进程架构,包括浏览器进程、渲染进程和GPU进程等。此外,理解CEF的异步通信机制,如Message Loop和Render Process ...
CEF v3是其一个重要的版本,提供了更好的性能和更多的API,使得与Chromium内核的交互更为灵活。 集成CEF到MFC应用的步骤如下: 1. **下载与设置**:访问CEF官网获取最新的CEF库和相应版本的Chromium源码。同时,...
前端浏览器的应用程序开发与以前传统的前端开发有很大不同,前端软件的功能越来越复杂,开发架构也非常多,例如Vue、React和Angular等。要想熟练地开发各种前端应用,就必须熟悉JS引擎对各种消息事件的处理过程。 ...
6. **多线程处理**:CEF通过多线程模型确保了UI的响应性和稳定性,避免因为网络活动阻塞主线程。 7. **性能优化**:CEF定期更新,以保持与最新Chromium版本的同步,确保了高效的渲染速度和内存管理。 8. **安全...
另外,CEF支持多线程渲染,通过调整线程池的设置,可以平衡资源消耗和响应速度。 总之,使用Chrome浏览器控件Delphi版,开发者能够快速构建具有现代Web功能的应用程序,同时享受到Chromium的强大性能。CEF4Delphi为...
- **并发请求管理**:Cronet可以高效地管理多个并发请求,避免了传统HTTP库可能遇到的线程管理和资源竞争问题。 - **网络条件适应**:Cronet能够根据网络条件动态调整策略,如在弱网环境下切换到更高效的协议或优化...
4. **多线程管理**:为了确保流畅的用户体验,多界面的切换和加载通常需要在不同的线程中执行,这部分代码会涉及到线程同步和通信机制。 5. **资源管理**:如内存管理、缓存策略,以优化性能和减少资源消耗。 6. **...