`

Javascript 的运行及浏览器多线程

阅读更多


  一。本文目的

  网页HTML结构以及 Javascript 程序越来越复杂了,有必要整理一下思路。

  本文只是想整理一下思路,很多细节不一定准确。


  二。问题详述

  现在一个网页中包含了多个 Iframe(Frame),每个 Iframe 都有 window (本文中 window 特指 DOM 中的 window,MS Windows 中的窗口与 X Window 中的窗口用 WINDOW 来表示),每个 window 都可以有 setInterval,以及 setTimeout,另外 window.document 里面还有很多的 element,每个 element 都可以有 event,而且这些 event 可以一直 bubble 到 body。

  问题 1. 在一个 window 内部,event 与 window.setInterval / window.setTimeout 是否并行?
  问题 2. window 之间的 Javascript 是否并行?
  问题 3. 属于同一个进程的 WINDOW 之间的 Javascript 是否并行?
  问题 4. 如果有并行存在,是一种怎么样的并行? 是浏览器为每一个 window 或 WINDOW 模拟了多线程,还是利用操作系统本身的多线程?
  问题 5. 如果有并行存在,如何解决 Javascript 运行中的互斥、信号?


  三。初步认识

  经过一些简单研究(因为懒,没去读 Firefox 源代码),有以下初步认识。

  对于 IE,用 SPY++ 分析,发现增加页面中的 Iframe 并不能导致线程的增加,也不能导致子 WINDOW 的增加。所以,IE 中的 Iframe 及 window 是 Shell.Explorer (shdocvw.dll 中的 COM 组件) 内部实现的,可能在一个单独的线程中,很可能就在 WINDOW 所属的线程中。进一步,WINDOW 中所有 Iframe 的 window 的内部的 Javascript 都是不并行的。再进一步,结合网络传输,如果一个 Iframe.src 赋值后,Javascript 所在的线程应该会通知另一个线程(本文中简称通讯线程)去向服务器发 HTTP 请求。通讯线程从服务器端接收了一个完整的 HTTP 包后,将把这个数据包交给负责显示的线程(中间环节可能有一个线程负责解析 html),显示线程(或解析线程)边显示边运行页面中的 Javascript,例如 document.write()。并不停的绘制屏幕。而在这个 HTTP 数据包处理过程中,并不会处理其他 Iframe 的 window 的 setInterval 之类的事件。处理完一件事情后,才会在内部的 timer / timeout 队列中选择一个到期的开始运行(调用)。

  所以,如果有一个 Iframe 的 window 的 Javascript 陷入死循环,则此线程内的所有的 Iframe 都将停止响应,并且从服务器端接收来的新数据也将被搁置。

  IE 中的多线程。在 IE 上按 Ctrl-N,或者运行 window.open() ,将会打开一个新的 WINDOW,从 SPY++ 中看,会相应的增加一个新线程,管理这个新的 WINDOW。但是没有增加更多的新线程,说明一个进程内所有的 WINDOW 都共用了通讯线程。也就是通讯进程管理了所有的 TCP Connection。 用 window.open() 返回的对象指针可以访问这个新 WINDWO,并且可以访问其下的 Iframe 的 window 中的各种数据,甚至也可以调用其中的函数,只是需要注意堆栈的不同。经过测试,如果两个线程的 Javascript 同时访问同一个数据,比如同时有 window.setInterval 指定的函数去访问一个 window 中的一个 element 的变量,或者修改属性,则其中的一个函数会返回 Javascript Exception:拒绝访问,说明浏览器在内部实现中注意了互斥。

  基于以上认识,对于 IE ,在一个 WINDOW 的所有 Iframe 的 window 内部应该不存在多线程,也不存在 Javascript 并行。当然也不会有 sleep 之类的函数了。把一个 Javascript 函数阻塞了(如特定的 ActiveX )可能导致整个 WINDOW 暂停相应。

  关于 IE 还有一个发现,window.setInterval 不是用 WM_TIMER 实现的。

  关于 Firefox,在 Windows 上,用 SPY++ 分析,页面中的每一个 Iframe 都是用一个 WINDOW 实现的。但是所有的 WINDOW,包括其他 Tab 打开的 WINDOW,都属于一个线程。但是跨 Tab ,跨浏览器窗口访问同时访问一个数据,也会引发 Javascript Exception:拒绝访问,说明 Firefox 的 Javascript 很可能是在一个 Tab 范围内,是不并行的。有可能是 Firefox 给每个 Tab 单独开了一个线程来运行 Javascript。反正最终行为要与 IE 保持差不多,估计也就这样了。

  在 Linux(FC6)上启动 Firefox,用 gdb attach 进去,发现在新打开网页时会增加不少线程,但网页显示稳定后过一段时间,线程数会减少。这也可能是因为运行 Javascript 的线程任务做完了。


  四。初步结论

  1. 在 IE 的一个 WINDOW 内,Firefox 的一个 Tab 内, Javascript 是单线程运行的。
  2. 如果要在页面上的各 Iframe 之间实现 Javascript 同步,则应该采用 window.setInterval 来实现,而不是把一个 Javascript 挂起。
  3. 在 IE 上跨 WINDOW,或在 Firefox 上跨 Tab 访问数据,则要注意用 try catch 解决线程互斥导致的 Exception。


(2006.12)

分享到:
评论

相关推荐

    elegant-threading:NodeJS和浏览器的多线程函数的简单定义

    优雅的线程 NodeJS和浏览器的多线程函数的简单定义该工具允许定义将以最直接的方式在单独的线程中执行的功能。 它具有零依赖性,并且不需要其他任何东西,例如其他Webpack插件。 优雅线程可在NodeJS和浏览器上使用,...

    chrome浏览器

     ·包含V8 Javascript虚拟机,这个多线程的虚拟机可以加速Javascript的执行。  ·具备隐私模式,可以让用户无需在本地机器上登录即可使用,这个功能与微软IE8中的Incognito类似。  ·浏览器将内置防止“网络钓鱼...

    突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述

    Javascript执行机制 在HTML5之前,浏览器中JavaScript的运行都是以单线程的方式工作的,虽然有多种方式实现了对多线程的模拟(例如:Javascript 中的 setinterval 方法,setTimeout 方法等),但是在本质上程序的...

    JavaScript Event Loop相关原理解析

    不想让浏览器变得复杂(避免复杂性),因为多线程需要共享资源、且可能修改彼此运行的结果。 该模式会导致的问题? 如果单个任务耗时长,会拖延整个程序的执行,可能导致浏览器无响应(假死) JavaSc

    讯浪安全浏览器 v6.2.zip

    采用独创的多线程、多任务技术,使网页浏览速度大大提高。操作简单,方便。给你简简单单的体验急速冲浪。最大程度的简洁界面,留出更多空间显示网页。将所有的广告收入的90%,以随机抽取的方式分享给讯浪安全浏览器...

    HTML5新特性 多线程(Worker SharedWorker)

    There is no doubt that JavaScript是没有多线程之说的,他只能一件事一件事的做,做完一件事再做下一件事,假如你的js要花一段比较长的时间做一件事的话,那么浏览器将会卡顿一段时间,不对用户的操作产生响应,这...

    thread-js:在浏览器中使用多线程的库

    线程js 该库使用被调用的 Ajax 或标有“tjs-script-include”类的脚本标签,并从 src ... 注意:为了防止浏览器运行 JavaScript,请将其类型属性设置为不是“text/javascript”的任何内容,例如“javascript/worker”

    JavaScript 函数节流详解及方法总结

    他同时会处理界面的渲染和页面JavaScript代码的执行(简单扩展一下,浏览器或者JavaScript运行大环境并不是单线程,诸如ajax异步回调、hybrid框架内与native通信、事件队列、CSS运行线程等等都属于多线程环境,不过...

    AriaNg(多线程下载工具) v1.0.0.0 官方安装版

    AriaNg多线程下载工具是一款智能路由上bt、pt程序Aria2的前端,使用纯html & javascript开发,无需任何编译器或运行环境即可运行,您只要将AriaNg放在您的Web服务器里并在浏览器中打开即可使用,软件使用响应式布局...

    google chrome standalone enterprise msi

     包含V8 Javascript虚拟机 这个多线程的虚拟机可以加速Javascript的执行  具备隐私模式 可以让用户无需在本地机器上登录即可使用 这个功能与微软IE8中的Incognito类似  浏览器将内置防止“网络钓鱼”及恶意软件...

    google chrome standalone enterprise 64

     包含V8 Javascript虚拟机 这个多线程的虚拟机可以加速Javascript的执行  具备隐私模式 可以让用户无需在本地机器上登录即可使用 这个功能与微软IE8中的Incognito类似  浏览器将内置防止“网络钓鱼”及恶意软件...

    google chrome standalone 64位

     包含V8 Javascript虚拟机 这个多线程的虚拟机可以加速Javascript的执行  具备隐私模式 可以让用户无需在本地机器上登录即可使用 这个功能与微软IE8中的Incognito类似  浏览器将内置防止“网络钓鱼”及恶意软件...

    ChromeStandaloneSetup64.exe

     ·包含V8 Javascript虚拟机,这个多线程的虚拟机可以加速Javascript的执行。  ·具备隐私模式,可以让用户无需在本地机器上登录即可使用,这个功能与微软IE8中的Incognito类似。  ·浏览器将内置防止“网络...

    刺客是一个分散的数据库,它使用后台线程杀死慢速JavaScript。-Node.js开发

    刺客是一个雇用Web工作者杀死慢速JavaScript的数据库。 背景这可以解决什么问题?...Web Worker允许您运行多线程JavaScript。 当您与主线程并行运行JavaScript时,主线程可以自由响应用户输入。 你可以解释吗

    YukiOS:浏览器操作系统

    YukiOS试图编写一个在您的浏览器中运行的完整多线程操作系统。 它由一个JavaScript内核加载和运行WebAssembly二进制文件,一个使用C语言公开内核函数(导入)的标准库以及一些有趣的程序组成,因此可用。 但为什么?...

    谷歌浏览器(Chromium) V19.0.1055.0 开发版

     ·包含V8 Javascript虚拟机,这个多线程的虚拟机可以加速Javascript的执行。  ·具备隐私模式,可以让用户无需在本地机器上登录即可使用,这个功能与微软IE8中的Incognito类似。  ·浏览器将内置防止“网络钓鱼...

    chrome43.x

     ·包含V8 Javascript虚拟机,这个多线程的虚拟机可以加速Javascript的执行。  ·具备隐私模式,可以让用户无需在本地机器上登录即可使用,这个功能与微软IE8中的Incognito类似。  ·浏览器将内置防止“网络钓鱼...

    ReactNative移动开发工具 v0.71.7

    在幕后,React Native在主线程之外,在另一个背景线程里运行JavaScript引擎,两个线程之间通过一批量化的async消息协议来通信(有一个专门的React插件)。 UI方面React Native提供跨平台的类似Flexbox的布局系统,...

    browser-learn:从0开始学习浏览器

    一个进程中也可以同时运行多个线程,我们会说程序是多线程运行的 一个进程内的数据可以供于其中的多个线程直接共享,多个进程之间的数据是不能直接共享的 进程之间相互隔离(不同的进程是通过IPC通信) 浏览器进展的...

    易语言-易语言调用GoogleV8引擎执行JS

    V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流操作系统中,甚至可以运行在移动终端 ( 基于 ...注意:每个V8对象都是线程安全的,你可以在多线程环境下放心的使用

Global site tag (gtag.js) - Google Analytics