Jscript执行流程

168 阅读3分钟

一、进程、线程的关系

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),

2f38d845b39de5603c7699513c316b5.png

console.log(1);
setTimeout(function(){
	console.log(2);
},0)
console.log(3);

132

setTimeout的间隔时间默认是4ms,如果给的值小于4,那js也会设置为4ms。

1、js把当前的行代码推进执行栈,

2、判断当前是异步代码还是同步代码;

2-1:如果是同步就执行

2-2:如果是个异步就把异步的回调函数推进webapis中,注册回调函数, 3;等待条件满足,webapis就把回调函数推进Event Queue事件队列的尾部; 4、loop Event线程不断的轮询 执行栈和事件队列,如果执行栈中没有被执行的任务,就把事件队列中的回调函数推到执行栈中