计算机网络(进程和线程)|对前端进程和线程的理解🍟🍟

246 阅读4分钟

进程和线程的概念

进程是操作系统分配资源的最小单位,线程是操作系统资源调度的最小单位 一个进程可以有多个线程,至少有一个线程 同一个进程下的不同线程可以进行资源共享,可以使用共享内存,但是某一个线程使用共享内存的时候,其他的线程只能等待,等该线程结束以后,才能使用该内存,不同的进程之间很难进行数据共享 多个进程之间不会互相影响,但是一个线程挂掉会影响整个进程

浏览器的进程

浏览器有多线程的,也有单线程的 火狐是单线程,chorme是多线程的 每打开一个浏览窗口都是一个进程

浏览器的运行一定是多线程的

浏览器的四大进程

浏览器进程:浏览器的主进程,只有一个

第三方插件进程:每种类型的插件对应一个进程,只有使用插件时,才创建

GPU(graphics processing unit 图形处理器)进程:负责整个页面的渲染,实现3D效果,只有一个

渲染进程:核心任务是将html、css、js转成用户可以进行交互的网页

我们可以通过浏览器的更多信息查看浏览器任务管理器的进程

Snipaste_2022-07-29_19-27-32.png

浏览器的线程

渲染进程包含的线程:

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发送请求和回复

页面渲染

拿到服务器端返回的数据,就可以开始页面的渲染工作了,相信这张图大家肯定都在各个博客中见过,我们就以此图为例

20181008165744218.png

html被解析成DOM树,css文件被解析成CSSOM规则树,这里有一个单词,叫做attachment:连接,这个词用的非常好,从这里我们就知道html和css的解析是同步进行的,css没有解析完成,html是不会渲染的,两个树合并之后会形成渲染树,对渲染树进行布局计算,然后将渲染树绘制到页面上

思考💡:为什么把css文件放在头部?

上面就是加粗的就是答案

这里也会涉及一个知识点

思考💡:回流和重绘到底怎么回事?

回流就是重新规划流式布局,因为浏览器本身就是流式布局,布局主要由两个因素决定:位置和大小,所以重流是为了确定页面元素的节点位置和大小;

重绘,顾名思义,重新绘制,是为了确定元素的样式,展现形式,绘制

那频繁的回流和重绘必然会带来性能问题,那就又出现了一个面试题

思考💡:怎么减少回流和重绘?

这个复习到再说

前端你必须要知道的进程、线程和事件队列

浏览器渲染原理及流程