线程是操作系统OS能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
一个进程可以开启多个线程,其中有一个主线程来调用本进程中的其他线程。
我们看到的进程的切换,切换的也是不同进程的主线程
多线程可以让同一个进程同时并发处理多个任务,相当于扩展了进程的功能。
进程是资源分配的最小单位,线程是CPU调度的最小单位。
我们做一个简单的比喻,进程比喻火车,线程比喻车厢.
浏览器有多线程的,也有单线程的 火狐是单线程,chorme是多线程的 每打开一个浏览窗口都是一个进程。浏览器的运行一定是多线程的。
**浏览器进程:**浏览器的主进程,只有一个
**第三方插件进程:**每种类型的插件对应一个进程,只有使用插件时,才创建
GPU(graphics processing unit 图形处理器)进程:负责整个页面的渲染,实现3D效果,只有一个
渲染进程:核心任务是将html、css、js转成用户可以进行交互的网页
GUI渲染线程:负责渲染界面,解析html和css,构建DOM树,CSSOM树,渲染树,和绘制页面,重绘和回流也是在该线程执行
js引擎线程:一个tab页面只有一个js引擎线程(单线程),负责解析和执行js,他和GUI渲染线程是互斥的,页面渲染遇到script标签就会停止渲染,交给js引擎线程,浏览器之所以遇到script标签就先执行js代码,是因为js的内容可能会影响到dom树的结构,不至于发生页面混乱。
计时器线程:指的是setTimeout和setInterval,因为js引擎线程是单线程的,如果出现阻塞,会发生计时不准,所以需要单独的线程完成计时器的工作
异步http请求线程:XMLHttpRequest连接后浏览器开的一个线程,如果请求有回调函数,异步线程就会将回调函数加入到异步队列中,等待js引擎空闲执行
事件触发线程:主要用来控制事件循环,比如js执行遇到计时器,Ajax异步请求等,就会将对应任务添加到事件触发线程中