进程与线程
- 进程:是计算机中的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单元
- 多进程:启动多个进程,多个进程可以一块来执行多个任务
- 单线程:进程内一个相对独立的,可调度的执行单元,于同属的一个进程共享着进程中的资源(同一时间,只能做一件事)
- 多线程:启动一个进程,在一个进程内部启动多个线程,这样,多个线程也可以一块执行多个任务(也是通过调度来做的,如同多进程 能做多任务一样,多线程也能做多任务)
进程 好比与一个工厂,内存资源共享;线程 好比工人,同时间内只能处理一件事
浏览器是多进程的
-
brower进程:浏览器的主进程,负责协调资源与主管其他进程,有且只有一个
-
负责浏览器界面显示,与用户交互。如前进,后退等
-
负责各个页面的管理,创建和销毁其他进程
-
将渲染(Renderer)进程得到的内存中的Bitmap(位图),绘制到用户界面上
-
网络资源的管理,下载等
-
第三方插件进程:管理浏览器中的插件功能与调用
-
GPU进程:负责 3D 绘制的,不负责 一般的界面渲染
-
浏览器渲染引擎进程(浏览器内核)
浏览器渲染引擎
该进程为多线程的,主要包括6个线程
-
js引擎线程:负责解析运行 Js 代码脚本,与 GUI线程 互斥。一个Tab页中同一时间内保持单线程,避免产生 DOM冲突
-
GUI线程:负责渲染浏览器界面,解析 HTML、CSS 后产生 DOM树、CSS树、Render树,处理页面布局以及绘制
-
异步http网络请求线程:处理网络请求与响应
-
定时器触发线程:处理setTimeout 与 setInterval 回调
-
浏览器事件触发线程:例如鼠标点击、悬浮等内置事件的监听、注册、触发
-
合成线程:将 GUI线程结果进行位图换算
单线程的缺点
同一事件只能处理一件事,当数据量过大时,计算能力有限
解决方案:
-
SSR(交由服务端数据处理、反馈一个静态页面)
-
webWorker(纯粹计算,无法访问DOM)
执行过程
实例代码解析
同步代码按顺序从上往下执行
// 同步代码按顺序从上往下执行
function test () { debugger;
var test1 = function () {
console.log(2);
}
test1();
console.log(1);
}
test();
// 2 1
优先执行同步代码,异步代码进入任务队列(其中分为 宏任务 和 微任务)
-
宏任务每次弹出一条最先执行完成的进入主线程
-
微任务会在每次主线程完成后,清空整个微队列线程
// HTML5 中规定的最小延迟4msconsole.log(1) setTimeout(function () { console.log(2); }) console.log(3);
HTML5中规定了 setTimeout 最小执行事件为 4ms,人眼的最佳反应时间一般设置为 30ms
setTimeout(function () {
console.log(1);
}, 1000)
setTimeout(function () {
console.log(2);
})
console.log(3);