我的回答
- 浏览器主进程
- 网络进程
- 渲染进程
- GPU进程
- 插件进程
渲染进程中的线程
- dom解析
- css解析
- layout布局
- layer分层
- gpu通信
- qurd render
参考回答
浏览器组成
- 早期浏览器是单进程结构,由于单进程会导致卡死,容易奔溃等原因。现在浏览器就有了多进程架构,将来会是面向服务架构的。
- 基本的多进程架构进程有:浏览器主进程、渲染进程、GPU进程、网络进程、其它插件进程等等
- 每个页面或者同站点将分配一个渲染进程。渲染进程是由多个线程相互协同。
- 浏览器主进程
负责包括地址栏、书签栏、前进后退按钮等部分的工作
- 渲染进程
负责一个tab内关于网页呈现的所有事情
- GPU进程
负责处理GPU相关的任务
- 网络进程
负责处理浏览器的一些不可见的底层操作,比如网络请求和文件访问
- 其他插件进程
渲染进程中都有什么线程?
- GUI渲染线程
- 负责渲染浏览器界面、解析HTML、CSS、构建DOM树和RenderObeject树、布局和绘制等
- 当界面需要重绘或由于某种操作引发回流时,该线程就会执行
- 注意:GUI渲染线程和JS引擎线程是互斥的,JS引擎线优先级高于GUI渲染线程,当JS引擎执行时GUI线程会被挂起,GUI更新会保存在一个队列中等到JS引擎空闲时间立即被执行
- GUI渲染线程
- JS引擎线程
- 也称之为JS内核,负责处理和解析JavaScript脚本程序,运行代码,如V8引擎等;
- JS引擎一直等待这任务队列中的任务,然后加以处理,render进程中永远只有一个JS线程在运行js程序
- 同样注意:GUI渲染线程和JS引擎线程是互斥的,JS执行时间过长,就会造成页面的渲染不连贯,导致页面渲染加载阻塞
- JS引擎线程
- 事件触发线程
- 归属于浏览器而不是JS引擎,用来控制事件循环;
- 当JS引擎执行代码块如:setTimeout、鼠标点击、Ajax异步请求、会将对应的任务添加到事件线程中
- 当对应的事件服务触发条件时,该线程会把事件添加到待处理队列的队尾,等到JS引擎来处理
- 事件触发线程
- 定时处理线程
- setInterval与setTimeout所在的线程;
- 浏览器定时计数器并不是由JavaScript引擎计数的,它是通过单独线程来计时并触发定时;
- 注意:W3C在HTML标准中规定,要求setTimeout中低于4ms的时间间隔算为4ms
- 定时处理线程
- 异步http请求线程
- 在XMLHttpRequest在连接后通过浏览器新开的一个线程请求
- 将检测到状态变更时,如果设置有回调函数,异步线程就会产生状态变更事件,将这个回调在放入事件队列中,再由JavaScript引擎执行
- 异步http请求线程