浏览器是多线程的(多进程)
- 每创建了一个Tab页。就相当于一个独立的浏览器进程。(浏览器的优化,一些进程被合并了)
- 浏览器能运行:是因为系统给它的进程分配了资源(cpu和内存)
浏览器有哪些进程
- 浏览器主控进程(负责协调)
- 第三方插件进程(使用插件时使用)
- GPU进程浏览器(3D绘制)
- 渲染进程(负责协调、脚本执行、事件处理)
为什么不是进程?
- 一个崩溃影响整个进程。
4.最主要的是渲染进程:它是多线程的。
- GUI渲染线程:负责渲染解析html树,css树,构建dom树和渲染树。布局绘制。他与js线程是互斥的,js执行时,gui会被挂起,gui会等待js引擎为空时立即执行。
- JS引擎线程:负责处理js脚本。Js执行时间过长,会导致页面渲染不连贯。一个tab页无论如何只有一个js线程在执行js程序。
- 事件触发线程:归属于浏览器,而不是js引擎。用来控制循环(理解为浏览器忙不过来)。当JS引擎执行代码块如setTimeout(异步任务)时。线程会把事件添加到队列末尾,等待js引擎处理。
- 定时触发线程:计时器不是由js引擎计数的,添加到事件队列中,通过线程计时,当计时完毕后,添加到事件队列中。等待js引擎空闲时处理。
- 异步http请求。Xmlhttprequset连接后,会通过先开一个线程请求,检测到状态变更时,将回调放入事件队列里。由js引擎处理。
浏览器进程和浏览器内核的通信过程。
- 首先
浏览器进程
获取用户请求,首先需要获取页面内容(比如通过网络下载资源)。随后将该任务通过接口传给渲染进程
,然后开始渲染。 渲染进程
接的接口收到信息。交给渲染线程
,然后开始渲染。渲染线程
开始渲染页面,这其间可能借助浏览器进程
获取资源,GPU来帮助渲染。最后渲染进程
把结果传给浏览器进程
。浏览器进程
收到结果并将结果绘制出来。
为什么互斥js引擎和gui渲染线程?
- 防止元素数据前后不一样。