深入了解浏览器运行原理
首先要了解一下线程和进程的区别
进程之间是不共享资源和地址空间的,所以不会存在太多的安全问题,而由于多个线程共享着相同的地址空间和资源,所以会存在线程之间有可能会恶意修改或者获取非授权数据等复杂的安全问题。
为什么浏览器是多进程的
如果多个页面共享同一进程,就会造成一个页面崩了,别的页面也会受到影响,用户体验效果不好,所以每个页面是独立的进程,进程之间不存在资源共享。当然,单进程会导致内存占用过大问题。
-
一个tab页面对应着一个独立的进程,因此每个tab页面都有其独立的渲染引擎实例,一个进程里面有很多线程,比如:
-
GUI线程,渲染html,当页面发生重绘回流时执行,当js引擎脚本运行时,就处于被挂起的状态,发生页面堵塞。
-
js引擎线程,跟GUI是互斥的。
-
定时触发器线程,定时器setInterval与setTimeout所在线程,不在js线程里面,可以结合事件机制综合理解
-
事件触发线程,因为js是单线程的,所以队列中的事件都要排队等待js去处理。
-
异步http请求线程,基于XMLHttpRequest,返回状态发生改变,如果设有回调函数,异步线程就返回的状态变更事件放到js处理队列中等待处理。
谷歌浏览器采用多进程架构模式,这意味着它不是像传统的单进程浏览器那样,在一个进程中运行所有的标签页和插件,而是将不同的任务分配给不同的进程