- [十二、websocket](#websocket_222)
- [十三、前中后序遍历应用](#_234)
- [十四、TCP和UDP的区别](#TCPUDP_239)
- [十五、http如何保持状态](#http_249)
- [十六、http1.0 和 http1.1 的区别](#http10__http11__256)
- [十七、http1.1 和 http2.0 的区别](#http11__http20__263)
- [十八、http常见状态码](#http_268)
一、 进程(process)和线程(thread)
进程是 CPU 资源分配的最小单位(是能拥有资源和独立运行的最小单位)。
线程是 CPU 调度的最小单位(是建立在进程基础上的一次程序运行单位)。
现代操作系统都是可以同时运行多个任务的,比如:用浏览器上网的同时还可以听音乐。
对于操作系统来说,一个任务就是一个进程,比如打开一个浏览器就是启动了一个浏览器进程,打开一个 Word 就启动了一个 Word 进程。
有些进程同时不止做一件事,比如 Word,它同时可以进行打字、拼写检查、打印等事情。在一个进程内部,要同时做多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。
由于每个进程至少要做一件事,所以一个进程至少有一个线程。系统会给每个进程分配独立的内存,因此进程有它独立的资源。同一进程内的各个线程之间共享该进程的内存空间(包括代码段,数据集,堆等)。
二、 浏览器属于一种多进程的架构
例如,我们默认打开一个tab页面,就会新建一个进程,不同的tab页面是不同的进程,因此单个tab页面的崩溃是不会影响到整个浏览器的。 可以充分利用现代CPU多核的优势,但是相应的,内存和CPU的资源消耗会更大。
浏览器的主要进程和职责:
主进程:负责浏览器界面的显示与交互。各个页面的管理,创建和销毁其他进程。网络的资源管理、下载等。
第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建。
GPU进程:最多只有一个,用于3D绘制
渲染进程(浏览器内核):内部是多线程的。主要负责页面渲染,脚本执行,事件处理等。
- GUI渲染线程:负责渲染界面,解析html、css,构建dom树和render树,布局和绘制。重绘和回流时,该线程会执行
- JS引擎线程:解析js代码
注意:GUI渲染线程和JS引擎线程是互斥的。
问:为什么js是单线程的?
答:如果是多线程就会出现UI操作的冲突,例如,假设存在两个线程同时处理一个dom,一个负责修改一个负责删除,那么这时候就需要浏览器来裁决如何生效哪个线程执行的结果。这其实可以使用锁来解决,但是为了避免因为引入锁带来更大的复杂性,js在最初就选择了单线程。 - 事件触发线程、定时器触发线程、异步http请求线程:我的理解是他们都是在事件准备好的时候把事件放入任务队列当中,等待js引擎来执行,可以说是用来辅助js引擎工作的
浏览器渲染流程:
- 解析 HTML 文件,构建 DOM 树,同时浏览器主进程负责下载 CSS 文件
- CSS 文件下载完成,解析 CSS 文件成树形的数据结构