常见的进程和线程有;
进程:
1)browser进程,是浏览器的主进程,该进程只有一个,负责浏览器界面的显示,与用户交互,比如前进后退等
2)第三方插件进程,每种类型的插件都对应一个进程,当使用该插件时,才创建进程
3)GPU进程,这个进程也只有一个,用于3D绘制等
4)渲染进程,每一个tab页面都有一个渲染进程,而且互相之间是不影响的,主要用来渲染页面,进行脚本执行等。在这个进程中,还有界面渲染线程,js引擎线程,http请求线程。浏览器事件触发线程等
线程:
1)界面渲染线程:负责渲染浏览器界面,解析html,css,建立DOM树等,当我们修改了一些元素的颜色或者背景色,页面就会重绘,当我们修改元素的尺寸,页面就会回流,回流比重绘的成本要高。
2)Js引擎线程:负责解析js脚本,运行js代码,一个tab页面无论什么时候都只能有一个js线程在运行js程序,界面渲染线程与JS引擎线程是互斥的,浏览器渲染的时候遇到<script>标签,就会停止界面的渲染,然后js引擎线程开始工作,执行里面的js代码,等js执行完毕,js引擎线程停止工作,界面渲染经常继续渲染下面的内容。所以如果js执行时间太长就会造成页面卡顿的情况,浏览器之所以遇到script标签就先执行js代码,是因为js的内容可能会影响到dom树的结构,不至于发生页面混乱。
3)事件触发线程,用来控制事件循环,并且管理着一个事件队列。当js执行碰到事件绑定和一些异步操作(如AJAX异步请求等),会走事件触发线程,将对应的事件添加到对应的线程中,(比如定时器操作,便把定时器事件添加到定时器线程),等异步事件有了结果,再把他们的回调操作添加到事件队列,等待js引擎线程空闲时来处理。因为JS是单线程,所以这些待处理队列中的事件都得排队等待JS引擎处理
4)定时触发器线程,setInterval与setTimeout所在线程
5)异步http请求线程,当执行到一个http异步请求时,就把异步请求事件添加到异步请求线程,等收到响应,再把回调函数添加到事件队列,等待js引擎线程来执行
事件循环机制
JS分为同步任务和异步任务,同步任务都在主线程上执行,会形成一个执行栈,主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放一个事件回调。一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,将可以运行的异步任务添加到执行栈中,开始执行,这样反反复复就是我们所谓的事件循环(Event Loop)