进程和线程的概念
进程是操作系统分配资源的最小单位,线程是操作系统资源调度的最小单位 一个进程可以有多个线程,至少有一个线程 同一个进程下的不同线程可以进行资源共享,可以使用共享内存,但是某一个线程使用共享内存的时候,其他的线程只能等待,等该线程结束以后,才能使用该内存,不同的进程之间很难进行数据共享 多个进程之间不会互相影响,但是一个线程挂掉会影响整个进程
浏览器的进程
浏览器有多线程的,也有单线程的 火狐是单线程,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异步请求等,就会将对应任务添加到事件触发线程中
页面的渲染过程
思考💡:这里也涉及一个非常经典的面试题,从输入url到页面呈现的过程?
DNS解析
因为我们输入的是一个url,而计算机其实是不认识这个url的,它只认识0101010这个组成的数字,所以我们需要把DNS将url解析成IP地址
TCP建立连接
获得我们访问的地址之后就可以发请求了,发请求之前最重要的一件事就是建立链接,也就是TCP的3次握手,传送门
http发送请求和回复
页面渲染
拿到服务器端返回的数据,就可以开始页面的渲染工作了,相信这张图大家肯定都在各个博客中见过,我们就以此图为例
html被解析成DOM树,css文件被解析成CSSOM规则树,这里有一个单词,叫做attachment:连接,这个词用的非常好,从这里我们就知道html和css的解析是同步进行的,css没有解析完成,html是不会渲染的,两个树合并之后会形成渲染树,对渲染树进行布局计算,然后将渲染树绘制到页面上
思考💡:为什么把css文件放在头部?
上面就是加粗的就是答案
这里也会涉及一个知识点
思考💡:回流和重绘到底怎么回事?
回流就是重新规划流式布局,因为浏览器本身就是流式布局,布局主要由两个因素决定:位置和大小,所以重流是为了确定页面元素的节点位置和大小;
重绘,顾名思义,重新绘制,是为了确定元素的样式,展现形式,绘制
那频繁的回流和重绘必然会带来性能问题,那就又出现了一个面试题
思考💡:怎么减少回流和重绘?
这个复习到再说