进程
进程是CPU资源分配的最小单位。
上图可知, 进程(ID 18164)得到CPU内存资源大小为205.8MB。
多进程
同一时刻、同一操作系统、运行2个或2个以上的进程。例如:边听歌(KuGou App)边敲代码(Idea App),KuGou与Idea同时运行且互不干扰。
浏览器的多进程
浏览器进程包括以下几种:
- Browser进程:浏览器的主进程,负责协调、主控。
- 第三方插件进程:使用插件时创建该插件对应的进程。
- GUI进程:最多只有一个GPU进程,负责3D绘制。
- 浏览器渲染进程(内核):默认一个Tab页面一个进程,有时多个空白Tab会合并成一个进程。Tab页面互不影响、控制页面渲染、脚本执行、事件处理等。(Tab页面包含css、js、onclick事件等)
上图中,360安全浏览器运行29个进程,打开至少29个页面(多个空白页面会合并为一个进程)。
多进程浏览器的特点
- 多进程充分利用CPU多核计算力的优势
- 避免第三方插件影响整个浏览器
- 注:某个Tab使用了第三方插件,此时插件失败仅影响这个引用插件的Tab,其他Tab不会受到影响。
- 避免页面渲染影响整个浏览器
- 注:某个Tab渲染失败,不影响其他Tab页面。
一言以蔽之:用户打开多个窗口,其中一个窗口挂了,其他窗口不会受影响(正常运行)。
进程与线程
-
进程是工厂,各工厂之间相互独立。( 进程之间相互独立)
-
线程是生产线,一个工厂内有多条生产线。( 一个进程可以有多个线程)
-
一个产品是都由一条或多条生产线完成。( 一个或多个线程合作完成一个任务)
-
生产线之间共享工厂资源。( 多个线程之间共享代码段、数据集、堆等以及进程资源,诸如打开文件和信号)
浏览器内核的多线程
浏览器内核常驻线程包括以下5种:
GUI渲染线程
负责渲染浏览器界面HTML元素,界面需要重绘(repaint)或者回流(reflow)时会执行GUI渲染进程。
- 回流:通常由某种操作引起。
JavaScript引擎线程
即JS内核,例如:Chrome的V8引擎,负责处理JavaScript脚本程序。
划重点:GUI渲染线程与JavaScript引擎线程是互斥的,即同一时刻只能由其中一个执行。
假设:GUI渲染线程时JavaScript 操纵DOM元素并删除某个div,那么被删除的div也会被渲染,与实际不符。JavaScript引擎在执行时,GUI线程通常会被挂起。GUI线程保存在等待任务队列中,JavaScript线程结束时立即执行GUI线程。
定时触发器线程
JS引擎如果处于阻塞状态会影响浏览器定时计数器的计时准确性,使用单线程计时并触发定时更为合理。
事件触发线程
一个事件被触发时(onclick事件),该线程会将事件添加至任务队列中等待JS引擎处理。
...
setTimeout(function() {
console.log("hello world.");
}, 2000);
...
JS运行至setTimeout函数时,会将function函数添加至任务队列中,等待主线程任务全部执行完毕之后才依次运行任务队列中的任务,直到运行至该函数时打印“hello,world.”。
HTTP异步请求线程
XMLHttpRequest在连接后是通过浏览器新开一个线程请求, 将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理。