浏览器的进程与线程详解

进程

进程是cpu的资源分配的最小单位。浏览器

多进程:多进程指的是在同一个时间里,同一个计算机系统中若是容许两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,好比你能够听歌的同时,打开编辑器敲代码,编辑器和听歌软件的进程之间丝绝不会相互干扰。服务器

浏览器是多进程的,浏览器的进程主要包括如下几种:

  1. Browser进程:浏览器的主进程(负责协调,主控)
  2. 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才建立
  3. GPU进程:最多一个,用于3D绘制
  4. 浏览器渲染进程(内核):默认每一个Tab页面一个进程,互不影响,控制页面渲染,脚本执行,事件处理等(有时候会优化,如多个空白tab会合并成一个进程)

在浏览网页时,同时打开几个新的页面, 这就要打开几个浏览窗口,但一旦开启十几个窗口,整个计算机就会愈来愈慢。网络


多进程浏览器的优势

  • 避免页面渲染影响整个浏览器
  • 避免第三方插件影响整个浏览器
  • 多进程充分利用多核优点
  • 方便使用沙盒模型隔离插件等进程,提升浏览器稳定性

通俗的讲,就是用户打开多个窗口,若是其中一个窗口崩掉了,也不会影响整个浏览器,其余的界面照样正常运行多线程

线程

  • 一个进程由一个或多个线程组成,线程是一个进程中代码的不一样执行路线;
  • 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)。

浏览器的渲染进程(浏览器内核),是多线程的,主要如下几大类:

  1. GUI线程
  2. Javascript引擎线程
  3. 事件触发线程
  4. 定时器线程
  5. 网络请求线程

GUI线程

负责渲染浏览器界面HTML元素,当界面须要重绘(Repaint)或因为某种操做引起回流(reflow)时,该线程就会执行。在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被”冻结”了.异步

Javascript引擎线程

也能够称为JS内核,主要负责处理Javascript脚本程序,例如V8引擎。Javascript引擎线程理所固然是负责解析Javascript脚本,运行代码。编辑器

Javascript是单线程的

这是由于Javascript这门脚本语言诞生的使命所致:JavaScript为处理页面中用户的交互,以及操做DOM树、CSS样式树来给用户呈现一份动态而丰富的交互体验和服务器逻辑的交互处理。若是JavaScript是多线程的方式来操做这些UI DOM,则可能出现UI操做的冲突; 若是Javascript是多线程的话,在多线程的交互下,处于UI中的DOM节点就可能成为一个临界资源,假设存在两个线程同时操做一个DOM,一个负责修改一个负责删除,那么这个时候就须要浏览器来裁决如何生效哪一个线程的执行结果。固然咱们能够经过锁来解决上面的问题。但为了不由于引入了锁而带来更大的复杂性,Javascript在最初就选择了单线程执行。函数

GUI 渲染线程 与 JavaScript引擎线程互斥!

因为JavaScript是可操纵DOM的,若是在修改这些元素属性同时渲染界面(即JavaScript线程和UI线程同时运行),那么渲染线程先后得到的元素数据就可能不一致了。所以为了防止渲染出现不可预期的结果,浏览器设置GUI渲染线程与JavaScript引擎为互斥的关系,当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到引擎线程空闲时当即被执行。优化

JS阻塞页面加载

因为GUI渲染线程与JavaScript执行线程是互斥的关系,当浏览器在执行JavaScript程序的时候,GUI渲染线程会被保存在一个队列中,直到JS程序执行完成,才会接着执行。所以若是JS执行的时间过长,这样就会形成页面的渲染不连贯,致使页面渲染加载阻塞的感受。插件

定时触发器线程

浏览器定时计数器并非由JavaScript引擎计数的, 由于JavaScript引擎是单线程的, 若是处于阻塞线程状态就会影响记计时的准确, 所以经过单独线程来计时并触发定时是更为合理的方案。线程

事件触发线程

当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件能够是当前执行的代码块如定时任务、也可来自浏览器内核的其余线程如鼠标点击、AJAX异步请求等,但因为JS的单线程关系全部这些事件都得排队等待JS引擎处理。

异步http请求线程

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

相关文章
相关标签/搜索