一起了解浏览器(知己知彼)

一、浏览器的进程

在浏览器中打开一个网页,相当于新起一个进程,进程内有自己的多线程。

如果是单线程,那么某个tab页奔溃了,就影响整个浏览器,体验差。所以浏览器是多线程的。

二、浏览器的内核(渲染进程)

页面渲染、js的执行、事件的循环都在这个进程进行。

浏览器的渲染进程是多线程的。

包含哪些线程呢?

1、GUI渲染线程

    . =>负责渲染浏览器界面,解析HTML、css、构建dom树和renderObject树、布局、绘制等;

    . =>当界面需要重绘(repaint)或由于某种操作引发回流(reflow)时,该线程就会执行;

    . =>GUI渲染线程与js引擎线程是互斥的:当js引擎执行时,GUI线程会被挂起(相当于被冻结了),GUI更新会被保存在一个列队中,等到js引擎空闲时立即被执行

2、js引擎线程

  . => js内核负责处理JavaScript脚本程序

    .=>js引擎线程负责解析JavaScript脚本,运行代码

    .=>js引擎一直等待着任务列队中任务的到来,然后加以处理。一个tab页(render进程)中无论什么时候都只有一个js线程运行js程序

     .=>同样注意,CUI渲染线程与js引擎线程是互斥的。所以如果js执行时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。

3、事件触发线程

    . =>事件触发线程归属于浏览器而不是js引擎。用来控制事件的循环。可以理解为:js引擎忙不过来,需要浏览器另开线程来协助。

    . =>当js引擎执行代码如setTimeout时(也可来自浏览器内核的其他线程,如鼠标点击、ajax异步请求等),将会对应任务添加到事件线程中。

    . =>对对应的事件符合条件被触发时,该线程会把事件添加到待处理队列尾部,当代js引擎处理

    . =>JS单线程关系,待处理队列中的事件都是排队。等待js引擎处理js引起空闲才会去执行

4、定时器触发线程

  . =>传说中的setInerval 与 setTimeout 所在的线程

   . => 浏览器定时器计数器并不是由js引擎计数的(因为js引擎是单线程的,如果处于阻塞状态就会影响计时的准确性)

  . =>因此,通过单线程来计时并触发定时(计时完毕后添加到事件列队中,等待js引擎空闲后执行)

  . =>W3C在HTML标准中规定,需要setTimeout中低于4ms的时间间隔算为4ms

你可能感兴趣的:(一起了解浏览器(知己知彼))