Gecko 线程分析一

Firefox开发者深度指南:从Gecko引擎到实战调优,打造高效开发环境 在Web开发领域,浏览器作为核心运行环境,其内核差异直接影响代码兼容性与性能表现。Chromium内核虽占据主流,但Gecko引擎作为独立技术路线,提供了不同的渲染机制与进程模型,对理解Web标准实现多样性具有重要价值。从技术原理看,Firefox的Quantum项目引入Rust编写的Stylo并行CSS引擎,显著提升了复杂页面的渲染效率,而多进程架构的优化则在内存管理上展现出独特优势。对于开发者而言,这不仅是性能调试的补充视角,更是确保代码跨平台健壮性的关键。在工程实践中,通过精细配置about:conf 阅读详情

Gecko 线程分析一

https://blog.youkuaiyun.com/BruceBaoZhiqiang/article/details/18323535
线程管理及主要线程

作为一个浏览器内核,Gecko所要完成的任务是非常繁杂的,其主要任务就是根据用户提供的资源地址(网址或本地文件路径),通过http协议从Web服务器中取得页面文档,然后解析其内容,最后根据一定的约定在浏览器指定区域中显示出页面,其中往往涉及网络编程及图形界面编程,而大家通常都知道的是网络编程中的连接、读取数据等往往需要考虑到服务器端的情况,一般采用异步方式来确保有效处理服务端返回的数据包括连接不成功、错误处理等;而图形界面的处理往往需要采用一个主消息循环及回调函数的方式来处理用户的动作,为了给用户提供平滑的操作而又兼顾后台服务器的不确定性,一个可行的浏览器内核必须充分利用多线程来协调处理复杂的应用场景,只有这样才能高效的完成其所要完成的任务,初步了解Gecko内核的线程模型及相关线程管理的知识,对了解Gecko是非常有帮助的,下面初步了解Gecko是如何进行线程管理及其主要线程实现。

Gecko线程模型

为了统一接口编程,Gecko将其线程模型按照组件的方式来处理,定义的接口主要有nsIRunnable、nsIEventTarget、nsIThread、nsIThreadManager、nsIThreadPool,其中nsIThreadManager由nsThreadManager来实现(注nsI开头的一般为接口一般有ns开头的来实现),它主要用于来管理所有的nsThread,包括创建nsThread实例,并通过维护一些系统原生线程的属性可以判断同一段代码是在什么线程的上下文中调用,从而可作出不同的处理,如GetIsMainThread可以判定当前执行线程是否为主线程,这一点在Gecko中应该得到了充分的应用,同时nsThreadManager的实例属于单例模式,在第一次启用XPCOM组件时由NS_InitXPCOM3实例化出来,以供以后管理nsThread(位置gecko/xpcom/threads/nsThread.cpp)使用。

gecko的线程管理位于:gecko/xpcom/threads中:

nsIRunnable:

这个接口是所有events/runnable对象的基类。(events/runnable在线程中调度)

具体的事件调度情况在nsRunnable中体现。在此就不多赘述了,之后会进行详细分析。

nsThread的类图:

nsThread代表一个普通的线程。

在其构造函数中会初始化它并启动原生线程,它同时增加了EventQueue及ThreadObserver的概念

其函数入口为nsThread::ThreadFunc

在线程的整个周期中也即nsThread::ThreadFunc中不断的处理外部线程或本身向其EventQueue中Dispatch来的Event,同时每处理一个Event之前都会检查其是否存在Observer,如存在则先让Observer调用其OnProcessNextEvent来处理该Event,然后调用Event本身提供的run方法,这样增加了nsThread处理Event的灵活性

nsThread统一由nsThreadManager来创建,通过调用其Shutdown方法来结束该线程;并提供了一组外部接口来进行线程管理操作

如:
NS_NewThread、NS_GetMainThread、NS_DispatchToMainThread、NS_ProcessNextEvent等以供不同线程调用,同时保证线程安全(文件位置:gecko/xpcom/glue/nsThreadUtils.cpp)

nsThreadPool代表一组线程(即线程池),当外部向其Dispatch一个Event时它先会向其中的EventQueue添加该Event,然后它会根据设置的参数来决定是否分配一个nsThread来处理该Event,一旦创建了一些nsThread则将其维护在mThreads队列中,同时向该nsThreadDispatch这个nsThreadPool实例以让该nsThread去执行该nsThreadPool的run方法,这样可保证线程池中的每个nsThread的执行体都是nsThreadPool中的run方法,在其run方法中会根据是否空闲等条件自动ShutDown一些暂时不用的nsThread,以达到线程池的目的,即当任务事件Event繁多的时候多开启一些线程来处理,一旦任务完成则释放大部分空闲线程,保持一小部分线程以等待新任务的分配及提交;nsThreadPool在异步读取网络流数据的时候会经常用到。
Gecko主要线程

MainThread是Gecko的主线程,也即进程启动时的执行序列,它主要处理图形界面的消息循环以及其他线程向它Dispatch过来的Event,这样可以有机的结合图形界面的处理及网络数据的读取、解析、渲染等。MainThread线程充分利用了Gecko线程模型特点,既能处理原生的窗口消息,又可及时处理其它线程通知给它的Event,其执行主体往往是Gecko的核心,据初步统计其执行时间往往占整个程序执行时间的90%以上,其效率的高低直接决定了是否会让用户产生阻塞停顿的感觉。其主要实现逻辑是在启动XPCOM当中会在nsThreadManager初始化时自动产生一个nsThread实例mMainThread,它代表进程启动时的执行序列,待该执行序列完成其他基本准备后,在nsBaseAppShell::Init中将其Observer设置为nsBaseAppShell实例本身

先分析到这,待续。。

参考文献:

https://developer.mozilla.org/en/docs/The_Thread_Manager

https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Threads

JavaScript单线程异步的背后——事件循环机制 感觉这篇文章拖了很久,好尴尬的拖延症。刚接触前端的时候,知识面是支离破碎的,甚至我都不知道我不知道的,比如事件。现在,慢慢的,我知道我不知道的,比如事件循环机制。然后花时间去了解,就变成我知道我知道的。说实话,这个我也就朦朦胧胧知道了一点。正文从这里开始~~~说起JavaScript特性,单线程运行当然是其中很重要的一点。那什么是单线程,什么是多线程呢?单线程就是事件要一件一件地做,排在前面的事情没 阅读详情

相关推荐

gecko-sdk,(用于XPCOM开发)

用于XPCOM组件开发,包含appcomps,embedstring,nspr,string,pref,xpcom,xpconnect等类库。

Geckofx使用心得(一)

写这篇的目的很简单,从萌新到熟悉,我花了2个月时间,甚至花钱买过一个网站的垃圾demo,深受其烦,希望可以让入坑Geckofx 的新手少走一些弯路, 做WebBrowser目前有3中方案, 1、基于 IE 的WebBrowser控件 2、Geckofx 3、CefSharp 如果你只是做最简单基础的功能,就直接用自带的WebBrowser控件既可(比如简单的访问、取值) 如果你要做的...

jwb7832007的博客 1万+

Gecko-Web浏览器内核源码

三大浏览器内核之一,配合xulruner开发自己的浏览器,非常不错的东西。

【Gecko项目实战指南】构建与配置全解析

【Gecko项目实战指南】构建与配置全解析 一、项目目录结构及介绍 欢迎来到 gecko 开源项目之旅!本项目基于 GitHub 页面 https://github.com/killme2008/gecko.git,旨在提供一个详尽的开发与部署指引。下面我们将揭开它的神秘面纱,从目录结构入手: gecko/ │ ├── README.md # 项目简介和快速入门指南 ├── ...

gitblog_00409的博客 544

Dify DSL文件分享 Dify讨论群 大模型token资源等(持续收集更新)

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

同名公众号:dify实验室 3713

想学嵌入式但没开发板?试试这个免费的STM32虚拟仿真平台(含LVGL界面教程)

本文介绍如何利用免费的STM32虚拟仿真平台学习嵌入式开发,特别适合预算有限或零硬件基础的学习者。通过详细的LVGL界面开发教程,展示虚拟仿真在嵌入式学习中的高效性和实用性,涵盖环境搭建、代码实现到实机迁移的全流程,助力快速掌握嵌入式开发核心技能。

weixin_29266647的博客 306

Exception in thread “pool-2-thread-1“ java.lang.ExceptionInInitializerError 解决

Exception in thread "pool-2-thread-1" :表示在某线程中的异常,最可能的是自己做异步操作时,借助线程池来完成,而异常就是在异步时抛出的。 java.lang.ExceptionInInitializerError 代表初始化失败时的异常。 较为神奇的是,编译出来的文件,明明有啊?报错信息为啥老是提到这一行呢? 如果出现这样的匪夷所思的问题,就要一步步向源头去找,于是我找到了罪魁祸首: 这是AlipayConfig报错的那一行,二这个参数又是从ConfigPro..

qq_36715887的博客 9740

微信聊天记录丢失原因与恢复方案详解

SQLite数据库作为移动应用常见的本地存储方案,其加密机制和存储结构直接影响数据安全性。以微信为例,聊天记录存储在EnMicroMsg.db等SQLite文件中,采用AES加密保护。当手机清理工具误删这些文件时,会导致特定时间段记录丢失。理解数据恢复原理需要掌握文件系统删除机制和闪存特性,其中关键点包括TRIM指令的影响和数据块覆盖风险。通过专业工具如DiskDigger或iMyFone D-Back,配合ADB调试和SQLite数据重组技术,可在黄金时间窗口内恢复记录。日常维护建议结合自动化备份方案和存

weixin_32612263的博客 386

Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法

创建的时候需要把chromedriver.exe的位置写在Service的XXX部分,需要调用他的命令行方法,不然报错,然后启动就可以了。 from selenium.webdriver.chrome.service import Service c_service = Service('XXX') c_service.command_line_args() c_service.start() d...

weixin_43838830的博客 3495

关于使用EB tresos出现无法激活的情况解决

我在安装eb studio时就是在激活方面有问题导致无法使用,下面讲解出现了什么问题以及我如何去解除的。EB安装完成时需要激活才能使用的,不然都打开或者建立不了工程,一直都是报的dns服务器错误,好的,那我改dns服务器地址。填写dns服务器地址,也可以换成别的,自己百度一下适合自己的。这是解决方案哈哈哈哈。

weixin_43673603的博客 6178

在Ubuntu 20.04上,用EtherCAT Igh 1.6.2驱动高创BD3E伺服电机(附完整C代码)

本文详细介绍了在Ubuntu 20.04实时内核环境下,使用EtherCAT Igh 1.6.2主站驱动高创BD3E伺服电机的完整实现方案。从实时系统配置、伺服电机PDO映射到精确控制线程设计,提供了完整的C代码样例和实际项目中的调试技巧,帮助开发者实现工业自动化中的高精度运动控制。

weixin_30772105的博客 110

Gecko 线程分析二

Gecko 线程分析二 https://blog.youkuaiyun.com/BruceBaoZhiqiang/article/details/18265525 线程分析二 之 nsIThread nsThread Gecko是如何使用Thread的。这些天一直觉得gecko中是使用自己的线程机制来完成事件的调用的。否则很难真正搞懂gecko中内部的工作流程。(可是老板就是不重视,自己想来想去...

hunter 256

coze开发-5、给智能体添加“技能”

中间编排与技能组件 中间编排的定义 中间编排是指在智能体的构建过程中,使用一些工具对智能体进行协调和管理。通过这些工具,我们能够更好地实现智能体在特定业务场景中的应用。

andyyah晓波的博客 527

Gecko 线程分析三

下面是对Gecko各个类进行分析

BruceBaoZhiqiang的专栏 838

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 809

5、AIX系统硬件管理与故障诊断全解析

本文全面解析了AIX系统的硬件管理与故障诊断方法,涵盖系统管理服务(SMS)的使用、设备兼容性配置、设备配置数据库结构、常用命令如cfgmgr、lsattr、smitty devices的操作详解,并深入介绍了错误日志管理机制,包括errdemon、errpt、errlogger等命令的应用。通过实际案例分析和流程图展示,帮助系统管理员掌握从问题怀疑到诊断执行再到日志清理的完整流程,同时提供注意事项与最佳实践,助力AIX系统的稳定运行与高效维护。

y2z3a4b5c的博客 61

gecko 相关process分析 大纲,代码总结性结论

1分别分析b2g process 2和nuwa process, 3 分析b2g 与nuwa的通信交互 4分析messageloop,ipdl 5分析APP如何启动     结构:                     |-XRE_main                                |                        ...

hunter 913

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

gecko线程分析

https://blog.youkuaiyun.com/brucebaozhiqiang/article/category/1826811 http://www.voidcn.com/article/p-tpczbpbg-dn.html http://www.bubuko.com/infodetail-9112.html

hunter 211

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Javascript是单线程的深入分析(转)

原文: http://blog.youkuaiyun.com/talking12391239/article/details/21168489 Javascript是单线程的 因为JS运行在浏览器中,是单线程的,每个window一个JS线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。而浏览器是事件驱动的(Event driven),浏览器中很多行为是异步...

137

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

js 高级笔记(线程机制与事件机制)

文章目录线程机制与事件机制进程与线程1. 进程(process):2. 线程(thread):3. 图解4. 相关知识:5.相关问题何为多线程?比较单线程与多线程?多线程:优点:缺点:JS单线程还是多线程?浏览器运行是单线程还是多线程?浏览器运行是单进程还是多进程?有的是单线程有的是多线程如何查看浏览器是否是多进程运行的呢?浏览器内核1. 支撑浏览器运行的最核心的程序2. 不同的浏览器可能不一样3. 内核由很多模块组成主线程:分线程:定时器引发的思考1. 定时器真是定时执行的吗?2. 定时器回调函数是在那个

努力的博客 1655

MetaQ源码分析——消息传输流程

Broker接收从Producer(Client端)发送的消息,也能够返回消息到Consumer(Client),对于Broker来说,就是网络输入输出流的处理。 Broker使用淘宝内部的gecko框架作为网络传输框架,gecko是一个NIO框架,有很多优秀的特性。 由于网络模块与其他模块关联性极强,不像存储模块可以独立分析,所以此篇文章开始将从全局开始分析Broker。 首先看一下Broker...

fanc的博客 477

深入分析 Javascript 单线程

面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚。来深入分析一下: 首先看下面的代码: 1 2 3 4 5 6 7 8 9 functionfoo() { c...

weixin_30248399的博客 53

多线程爬虫

这是一篇简单的python多线程爬虫实例

yanta0的博客 977

工欲善其事,必先利其器——线程池的使用

线程池的使用同步代码演示异步,线程池代码同步爬虫爬取图片使用线程池的异步爬虫爬取4K美女图片注意 学到现在,我们可以说已经学习了爬虫的基础知识,如果没有那些奇奇怪怪的反爬虫机制,基本上只要有时间分析,一般的数据都是可以爬取的,那么到了这个时候我们需要考虑的就是爬取的效率了,关于提高爬虫效率,也就是实现异步爬虫,我们可以考虑以下两种方式:一是线程池的使用(也就是实现单进程下的多线程),一是协程的使用(如果没有记错,我所使用的协程模块是从python3.4以后引入的,我写博客时使用的python版本是3.9)。

ShiJieDeYinYu的博客 256
上一篇: geeker 操作:
下一篇: Gecko 线程分析二
nedwons
博客等级 码龄9年 311粉丝 572原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值