Gecko 线程分析二

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

Gecko 线程分析二
https://blog.youkuaiyun.com/BruceBaoZhiqiang/article/details/18265525

线程分析二 之 nsIThread nsThread

Gecko是如何使用Thread的。这些天一直觉得gecko中是使用自己的线程机制来完成事件的调用的。否则很难真正搞懂gecko中内部的工作流程。(可是老板就是不重视,自己想来想去的,按他自己的想法指挥。)没办法,只能自己来看gecko线程机制是怎么回事儿了。

通过从网上查找资料和自己对代码的查找了解,现在对gecko的线程情况总结整理如下。

首先,Gecko内部的thread基本是使用nsIThread这个interface,通过NS_NewThread来产生。

thread 会有一個job queue,thread会一直执行queue里面的job,如果沒有job时,则是停留在queue內部,此时不会消耗额外的cpu;而由NS_NewThread所产生的thread会由另外一个class,nsThreadManager来管理,当系统要停止时,nsThreadManager会把它所管理的所有的thread分别调用nsIThread::Shutdown,来将其下的thread停止。

下面是nsIThread的主要函数:

class NS_NO_VTABLE nsIThread : publicnsIEventTarget {

public:

NS_DECLARE_STATIC_IID_ACCESSOR(NS_ITHREAD_IID)

/* [noscript] readonly attributePRThread PRThread; */

NS_IMETHOD GetPRThread(PRThread**aPRThread) = 0;

/* void shutdown (); */

NS_IMETHOD Shutdown(void) = 0;

/* boolean hasPendingEvents (); */

NS_IMETHOD HasPendingEvents(bool*_retval) = 0;

/* boolean processNextEvent (inboolean mayWait); */

NS_IMETHOD ProcessNextEvent(boolmayWait, bool *_retval) = 0;

};

NS_DEFINE_STATIC_IID_ACCESSOR(nsIThread, NS_ITHREAD_IID)

对于以上函数的介绍在gecko的idl声明的注释中有很好的解释:

/B2G/gecko/xpcom/threads/nsIThread.idl

下面是nsIThread的继承图和工作的协作图:

下面我们来看一段简单的例子:

nsCOMPtr sThread;

class HelloThread : public RefCounted {

public:

void HelloWorld() {

printf(“here is HelloThread”);

}

};

void InititalizeThread() {

NS_NewThread(getter_AddRefs(sThread));

}

void ReleaseThread() {

sThread->Shutdown();

}

void AddJob() {

nsCOMPtr event =NS_NewRunnableMethod(new HelloThread(), &HelloThread::HelloWorld);

sThread->Dispatch(event,NS_DISPATCH_NORMAL);

}

上面是一个简单的helloThread,当使用者调用AddJob时,便会新增一个job到nsThread的queue里面,然后sThread便会去执行HelloWorld()这个function,打印出”here is HelloThread”.

下面是几个注意点:

1、HelloThread不一定要继承RefCounted,只要有AddRef和Release即可。

2、只要调用NS_DispatchToMainThread便会将job指定给MainThread。

3、Shutdown是一个blockingfunction,当执行sThread->Shutdown时,会等待将thread内部所有的job都执行完才会离开。

4、不要sThread本身调用自己Shutdown,这样会造成死锁。

nsThread 成员函数:

AddRef()

nsISupports

adjustPriority(inlong delta)

nsISupportsPriority

dispatch(innsIRunnable event, in unsigned long flags)

nsIEventTarget

DISPATCH_NORMAL

nsIEventTarget

DISPATCH_SYNC

nsIEventTarget

GetPRThread()

nsThread

[inline]

hasPendingEvents()

nsIThread

Init()

nsThread

InitCurrentThread()

nsThread

isOnCurrentThread()

nsIEventTarget

nsThread()

nsThread

nsThreadShutdownEvent class

nsThread

[friend]

observer

nsIThreadInternal

popEventQueue()

nsIThreadInternal

priority

nsISupportsPriority

PRIORITY_HIGH

nsISupportsPriority

PRIORITY_HIGHEST

nsISupportsPriority

PRIORITY_LOW

nsISupportsPriority

PRIORITY_LOWEST

nsISupportsPriority

PRIORITY_NORMAL

nsISupportsPriority

processNextEvent(inboolean mayWait)

nsIThread

PRThread

nsIThread

pushEventQueue(innsIThreadEventFilter filter)

nsIThreadInternal

QueryInterface(innsIIDRef uuid,[iid_is(uuid), retval] out nsQIResult result)

nsISupports

Release()

nsISupports

sGlobalObserver

nsThread

[static]

shutdown()

nsIThread

ShutdownRequired()

nsThread

[inline]

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

相关推荐

Gecko-Web浏览器内核源码

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

gecko框架概述

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34112181的博客 563

JAVA编写的Gecko内核浏览器源码

用JAVA编写的多种浏览器Demo程序,集成火狐的Gecko内核、调用IE内核

Gecko 线程分析一

Gecko 线程分析一 http://www.bubuko.com/infodetail-9112.html 线程管理及主要线程 作为一个浏览器内核,Gecko所要完成的任务是非常繁杂的,其主要任务就是根据用户提供的资源地址(网址或本地文件路径),通过http协议从Web服务器中取得页面文档,然后解析其内容,最后根据一定的约定在浏览器指定区域中显示出页面,其中往往涉及网络编程及图形界面编程,而大家...

hunter 428

Simulink Test Sequence实战:5步搞定复杂逻辑测试(附Excel模板)

本文详细介绍了如何利用Simulink Test Sequence模块高效完成复杂逻辑测试。通过对比传统Excel方法的不足,阐述了Test Sequence以流程图和自然语言描述测试场景的优势,并提供了从环境搭建、逻辑构建到与Test Manager集成、利用Excel模板进行数据驱动的完整5步实战指南,帮助工程师将复杂的状态机或逻辑流测试从繁琐的‘体力活’转变为高效的‘技术活’。

snow3的博客 251

单片机技术入门与实战:从零基础到项目开发

单片机(MCU)作为嵌入式系统的核心组件,集成了CPU、内存和各种接口电路,广泛应用于智能家居、工业控制和汽车电子等领域。其工作原理基于实时控制和低功耗设计,通过定时器、中断系统和通信接口等功能模块实现各种控制任务。在物联网和智能硬件快速发展的背景下,掌握单片机开发技术成为电子工程师的重要技能。本文以STM32和PIC系列为例,详细解析单片机的基本概念、功能模块和选型指南,并分享从入门到项目实战的系统学习方法,帮助开发者在3-6个月内快速掌握这一关键技术。

weixin_35753291的博客 652

四大主流浏览器内核(Trident、Gecko、Presto、Webkit)

浏览器解析渲染页面原理浏览器 最重要 最核心的部分是“解释引擎”,也就是“浏览器内核”: 负责对网页语法的解释(如HTML、JavaScript)并渲染(显示)网页。 网页的工作过程需要使用到两个引擎:渲染引擎和JavaScript引擎 什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript代码的运行环境 所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,

洋葱onion 3万+

AD20/Altium designer——如何进行DRC检查、冲突的错误如何改正

对于一个画完的PCB,我们常常需要进行DRC检查,确保板子的电器连接及制作工艺在设定规则的范围内,本篇将介绍如何对PCB进行后期DRC检查处理,确保电路板出现不必要错误。 1.DRC检查入口 2.DRC设置 3.错误分析 对于错误的内容,依据个人实际情况不同,其出现的原因都是因为与设计规则中的设定标准冲突,这里按遇到的错误进行修改讲解,其他错误同理。 4.常见错误分析及解决方法 (1) 解决方法:将未连接网络连接(...

嵌入式创客工坊的博客 5万+

Mozilla FireFox Gecko内核源代码解析(1.nsParser)

Mozilla FireFox Gecko内核源代码解析 (1.nsParser) 中科院计算技术研究所网络数据科学与工程研究中心-信息抽取小组 耿耘 gengyun@sohu.com 前言: 在Web信息抽取的工作过程中,我们主要处理的都是经过各种处理HTML格式文档,而无论是DOM方式还是视觉方式的信息抽取,都需要对HTML进行解析,而最标准的解析器莫过于浏览器内核引擎,因此,对于...

yuanlanxiaup 1305

从零到一:高通Memory QMVS测试环境搭建的避坑指南

本文详细介绍了高通Memory QMVS测试环境搭建的全流程避坑指南,涵盖硬件选择、软件配置、QMVS核心组件安装及测试执行技巧。重点解析了adb工具配置、QPST日志抓取等关键步骤,帮助工程师高效搭建稳定测试环境,避免常见兼容性和稳定性问题。

weixin_29251567的博客 557

UE5 Niagara基础知识讲解

在UE5版本中,Niagara粒子系统引入了许多可添加的模块,分别用于控制发射器的生成和更新、粒子的生成和更新以及渲染效果。本文采用虚幻5.2.1版本,以图文方式对Niagara基础知识进行讲解。

一碗清深的博客 2470

Gecko 线程分析三

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

BruceBaoZhiqiang的专栏 839

十一、增强现实

那都是n年前的老版本了,新版本完全没有这个问题,我就是纠结这个问题,搭建若干环境,又是vmware虚拟机,又是msys2,又是anaconda,又是找机器,折腾了几天,结果通通不是。以一张实际卡片为锚点,通过笔记本的摄像头,在显示器上将一个计算机内的3d物体显示在卡片上,类似于电影上看到的那种全息投影技术;如果你是想在windows环境下开发linux运行程序,那么CygWin/gcc是你的不二之选。而如果你想开发的是windows运行程序,并且追求速度,那么二者相比而言,MinGW是更好的选择。

3189

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

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

hunter 913

执行HDevelop项目

这一节,我们讲述的是如何用HDevEngine加载和执行一个HDevelop项目。代码部分来源于示例程序exec_program(源文件exec_program.cpp),检测塑料零件边界上的毛刺。1.Step 1:初始化首先,我们包含HALCON/C++和HDevEngine头文件以及命名空间。注意到在这个示例程序中,HDevEngine头文件已经包含在my_hdevoperatorimpl中,所

Z's Palace 2995

基于Simulink的永磁同步电机容错控制(缺相容错)

本文基于Simulink平台,详细介绍了永磁同步电机(PMSM)缺相容错控制的仿真实现方法。针对逆变器开路故障导致的缺相问题,提出"检测-重构-补偿"三阶段控制策略:采用电流阈值法快速检测故障(<5ms),重构αβ坐标系实现两相矢量控制,并通过谐波电流注入抑制转矩脉动(<8%)。仿真结果表明,该方法能有效维持故障后电机运行,转速波动<3%,满足电动汽车等关键应用的可靠性需求。文章包含完整的Simulink建模步骤、MATLAB函数代码及参数设置,为工程实践提供了可复现的

xiaoheshang_123的博客 146

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

CamoFox浏览器拆解:从Gecko内核到Persona机制的指纹伪装实践

浏览器指纹追踪是当前数字广告与风控体系中的核心技术,它通过Canvas、WebGL、字体、时区等数十个环境特征构建用户唯一标识,即便清除Cookie仍能精准识别用户身份。因此,反指纹浏览器与隐私增强技术成为网络隐私保护的重要研究方向。Firefox作为开源浏览器,其Gecko内核提供了更底层的扩展能力,为二次开发实现深度指纹伪装创造了条件。基于Gecko内核的CamoFox项目正是这一思路的典型实践,它引入Persona机制,将UA、语言、时区、硬件参数、WebGL信息等字段打包为逻辑一致的身份集合,避免字

weixin_32736961的博客 236

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

137

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

camofox-browser:深度定制Gecko内核的反检测浏览器运行时

浏览器自动化运行时是现代前端测试、合规数据采集与反爬对抗的核心基础设施。其技术本质涉及内核级控制、协议栈重构与多层指纹伪装,关键能力包括Puppeteer/Playwright兼容性、国密算法原生支持及行为级人类操作模拟。相比Electron或Chromium基方案,基于Gecko深度改造的轻量级浏览器运行时在等保合规、内存确定性与密码学扩展性上具备不可替代优势。camofox-browser正是这一技术路径的典型实践——它通过劫持NSS初始化、重写RemoteAgent协议、注入LSTM驱动的鼠标轨迹模型

weixin_29323493的博客 133

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
上一篇: Gecko 线程分析一
下一篇: gecko线程分析
nedwons
博客等级 码龄9年 311粉丝 572原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值