一、进程、线程的关系
1、进程:是系统进行资源分配和调度的基本单位,也就是真正运行的一个程序。
2、多进程:就是同一时间内启动多个程序,处理多个任务。
3、单核CPU通过轮转时间片的算法,模拟多进程。
4、线程:是进程内调度的基本单位。
5、多线程:就是一个进程内,启动多个线程。进程也是通过轮询时间片的算法,调度线程,不同的线程处理不同的业务,线程之间可以共享进程的资源。
二、应用程序和进程的关系
1、一个应用程序可以有多个进程:
三、浏览器常驻进程:
1、browser进程,
2、第三方进程、
3、GPU进程(硬件加速、3D建模、绘制用户界面、运动)、
4、浏览器渲染引擎进程(Renderer进程)
四、渲染引擎进程常驻的线程:
1、js引擎线程(单线程)如V8引擎,js内核就是js引擎;如果是多线程,他们同时修改一个dom元素的背景元素,那是以哪一个为准呢。为了防止dom冲突必须为单线程。
注意:js处理大数据的方案:1、SSR(服务端渲染);2、webworker:向js引擎申请一个子线程,(是浏览器开的子线程,是不能操作dom元素的)专门用来处理大数据。
处理数据不大不小怎么办的?采用异步的方式去处理
2、GUI线程(渲染页面绘制DOM);
注意:GUI线程和js引擎线程是互斥的:比如我们在js里面写一个死循环,页面就会被卡死。。
3、http网络请求线程(webApis)
4、定时器触发线程
5、浏览器事件处理线程
3、4、5:处理异步一些耗时的操作,避免页面卡死。通过事件驱动通知js线程。
五、js的运行原理:
js引擎程序是单线程的,同时执行异步,通过事件驱动的方式模拟异步。所有的异步都是以回调的方式执行,但是回调函数并不是异步。
js任务的执行栈:1、同步(UI/主线程)线程;2、异步线程:event Table、webApis注册回调函数、Event Queue(事件队列)、loop Event(轮询call stack和Event Queue,如果call stack没有被执行的代码就到Event Queue里面取出一个任务放到call stack),
console.log(1);
setTimeout(function(){
console.log(2);
},0)
console.log(3);
1、3、2
setTimeout的间隔时间默认是4ms,如果给的值小于4,那js也会设置为4ms。
1、js把当前的行代码推进执行栈,
2、判断当前是异步代码还是同步代码;
2-1:如果是同步就执行
2-2:如果是个异步就把异步的回调函数推进webapis中,注册回调函数, 3;等待条件满足,webapis就把回调函数推进Event Queue事件队列的尾部; 4、loop Event线程不断的轮询 执行栈和事件队列,如果执行栈中没有被执行的任务,就把事件队列中的回调函数推到执行栈中