浏览器内核常驻线程

浏览器内核常驻线程

  1. 浏览器 GUI 渲染线程
  2. JavaScript 引擎线程
  3. 浏览器定时触发器线程
  4. 浏览器事件触发线程
  5. 浏览器 http 异步请求线程

浏览器 GUI 渲染线程 和 JavaScript 引擎线程之间是互斥的

在debug里面check一下如下代码的效果即可知道

var sleep = function(time) {
    var date = new Date();
    while(new Date() - date <= time) {}
}
document.body.innerHTML = ‘123‘;
sleep(3000)

原理也很简单:

  • GUI渲染线程负责渲染浏览器界面的HTML元素, 当界面需要重绘(repaint)由于某种操作引发回流(reflow)时,该线程就会执行。
  • 因为 JavaScript脚本是可操纵DOM元素, 在修改这些元素属性同时渲染界面, 那么渲染线程前后获得的元素数据就可能不一致了。
  • 所以在脚本中执行对界面进行更新操作, 如添加结点,删除结点或改变结点的外观等更新并不会立即体现出来, 这些操作将保存在一个队列中,待JavaScript引擎空闲时才有机会渲染出来。

所以当遇到在js引擎运算量较大的时候, 又想及时调用GUI渲染,可以做如下修改:

var sleep = function(time) {
    var date = new Date();
    while(new Date() - date <= time) {}
}
document.body.innerHTML = ‘123‘;
setTimeout(function() {
   sleep(3000);
}, 0);

JavaScript 引擎线程

事件驱动(event driven)机制

事件驱动一般通过事件循环(event loop)和事件队列(event queue)来实现的。

假定浏览器中有一个专门用于事件调度的实例(该实例可以是一个线程,可以称之为事件分发线程event dispatch thread),该实例的工作就是一个不结束的循环,从事件队列中取出事件,处理所有很事件关联的回调函数(event handler)。

注意回调函数是在Javascript的主线程中运行的,而非事件分发线程中,以保证事件处理不会发生阻塞。

Event loop code

如果队列非空,引擎就从队列头取出一个任务,直到该任务处理完,即返回后引擎接着运行下一个任务, 在任务没返回前队列中的其它任务是没法被执行的.

与其它线程间的通信

浏览器 http 异步请求线程

浏览器对同一域名进行请求的并发连接数是有限制的,result10 in IE 8, 6 in Firefox 3+ and Chrome 5+。详情参考demo: http://developer.oncecode.com/comet/

XMLHttpRequest在连接后是通过浏览器新开一个线程请求, 将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理

浏览器事件触发线程

接受浏览器里面的操作事件响应。如在监听到鼠标、键盘等事件的时候, 如果有事件句柄函数,就讲对应的任务压入队列。

浏览器定时触发线程

浏览器模型定时计数器并不是由JavaScript引擎计数的, 因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确, 它必须依赖外部来计时并触发定时。

setTimeout & setInterval

setTimeout:在参数指定的时间后将待执行方法放到执行队列中, 如果队列中没有其他方法等待,则会立即执行setTimeout指定的方法。

setIinterVal:  定时触发器线程每间隔指定的时间将指定方法放入到执行队列中,  当函数执行时,如果发现同一个定时器已经有多个在等待执行的任务,只会执行1次。后面的会被忽略掉。

var sleep = function(time) {
    var date = new Date();
    while(new Date() - date <= time) {}
}
var time = new Date();
var a = setInterval(function(){
    sleep(200);
    console.log(new Date() - time);
    if(new Date() - time > 700) clearInterval(a);
}, 100);

//output
303
506
708

以上代码表示在700时间内,一共有7个timer callback被压入队尾, clearInterval后, 只有3个timer对应的callback得到执行。 所以这种情况可以采用setTimeout的方式来让执行结果更加符合开发预期:

var a = setTimeout(function(){
    sleep(200);
    setTimeout(arguments.callee, 100)
}, 100);

参考:

http://blog.csdn.net/jqrsdsy/article/details/7335249

http://ronxin999.blog.163.com/blog/static/4221792020115711582653/

时间: 2025-01-11 16:21:55

浏览器内核常驻线程的相关文章

从浏览器内核级别修改layout相关的UI行为

具体说来,有几个不同的代码修改层次. 最底层上layer树硬件合成加速部分的修改,在这一层你可以做到的是让某个图层显示往上或者往下一点,同时页面的JS代码根本不知道这一点:但是要注意,页面交互所依赖的HitTest作用在这一层,一个最顶上的RenderLayer对象最先hitTest测试.所以你要确保不会影响原来的hitTest逻辑,思路就是维护两套索引:用于显示的,和用于model的. 接下来可以修改RenderObject层.实际上,这一层正是layout的核心.你需要了解不同RenderO

基于浏览器内核的被动式爬虫任务下发框架

基于浏览器内核的被动式爬虫任务下发框架 现有基于浏览器的客户端测试框架通过ChromeDriver这类组件来主动控制,但主动控制有缺点: 重新load下一个页面时,上一个页面可能仍有JS代码在执行,或者网络层的连接阻塞.UI线程阻塞什么的: 通过WebView接口注入执行的JS代码可能因为各种情况意外出错,出错的话无法获得通知 无法可靠地向浏览器查询,获得当前任务是否已经执行完成的信息 这里给出一个简单的基于修改chromium内核,进行被动控制的思路及流程如下: 浏览器启动时,通过一个'给定的

浏览器内核、缓存的介绍第二部分

 一.浏览器内核是用什么开发的 C#, C ,C++,delphi,ObjC 等都可以 理论上你几乎可以用任何语言, 比如你用Flash做个可以输入地址载入页面的exe也未尝不可, 同样python也是可以的. 但是由于对这类使用密度很大的工具应用需要考虑综合性能,所以最好是能够高效执行的代码,比如上面的delphi和一批C系的语言. 二.浏览器中的单核与双核 浏览器双核是指有两套软件用来展示网页(即渲染引擎),如果一个引擎展示某个网站失败,就会自动换用引擎,保证网页完美显示. 例如 搜狗双

浏览器内核引擎开发工作的主要关注点

浏览器内核引擎开发工作的主要关注点 跳转至: 导航. 搜索 目录 1 稳定性 2 性能 3 功能 4 其他因素 稳定性 对Android浏览器这种既有Java代码又有C++代码来说,稳定性意味着: Java代码不应该有NPE(空指针异常) C++代码不能出现内存错误,包括: null deref 指针越界访问 重复delete.free后use.循环引用.不对齐访问 等等 在某些情况下,空指针来自于有线程安全问题的代码(存在竞争条件),这类问题无法稳定再现,必须做好设计.review.编码规范,

浏览器内核、引擎、页面呈现原理及其优化

浏览器内核.引擎.页面呈现原理及其优化 介绍浏览器内核.JavaScript 引擎以及页面呈现原理等基础知识,同时根据原理提出页面呈现优化方案. 浏览器内核 浏览器内核又叫渲染引擎,主要负责 HTML.CSS 的解析,页面布局.渲染与复合层合成.浏览器内核的不同带来的主要问题是对 CSS 的支持度与属性表现差异. 现在主流的内核有:Blink.Webkit.Gecko.EdgeHTML.Trident,这里面有几个需要注意的地方: Blink 是在 Webkit 的基础上的改进,是现在对新特性支

Browser进程和浏览器内核(Renderer进程)的通信过程

看到这里,首先,应该对浏览器内的进程和线程都有一定理解了,那么接下来,再谈谈浏览器的Browser进程(控制进程)是如何和内核通信的, 这点也理解后,就可以将这部分的知识串联起来,从头到尾有一个完整的概念. 如果自己打开任务管理器,然后打开一个浏览器,就可以看到:任务管理器中出现了两个进程(一个是主控进程,一个则是打开Tab页的渲染进程),然后在这前提下,看下整个的过程:(简化了很多) Browser进程收到用户请求,首先需要获取页面内容(譬如通过网络下载资源),随后将该任务通过Renderer

浏览器内核

主流浏览器内核介绍(前端开发值得了解的浏览器内核历史) 最近 "个人恶趣味" 持续发酵,突然想了解下浏览器内核的发展历史. 内核 首先得搞懂浏览器内核究竟指的是什么. 浏览器内核又可以分成两部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎.它负责取得网页的内容(HTML.XML.图像等等).整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机.浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效

浏览器内核、渲染引擎、js引擎

[1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎: firefox使用gecko引擎 IE使用Trident引擎 2015年微软推出自己新的浏览器,原名叫斯巴达,后改名edge,使用edge引擎 opera最早使用Presto引擎,后来弃用 chrome\safari\opera使用webkit引擎 13年chrome和opera开始使用Blink引擎 js

Rendering Engine 主流的浏览器内核(排版引擎、渲染引擎、解释引擎)有哪几种,分别的特点

一.A web browser engine A rendering engine is software that draws text and images on the screen. The engine draws structured text from a document (often HTML), and formats it properly based on the given style declarations (often given in CSS). Example