JS运行机制

2021-04-17  本文已影响0人  一个记事本

什么是进程?

什么是线程?

进程和线程的区别?

多进程和多线程

-多进程:多进程指的是在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,比如大家可以在网易云听歌的同时打开编辑器敲代码,编辑器和网易云的进程之间不会相互干扰

浏览器

浏览器是多进程的

浏览器包含哪些进程?

浏览器进程工作

1、Browser主进程 收到用户请求,首先需要获取页面内容(如通过网络下载资源),随后将该任务通过RendererHost接口传递给Render渲染进程
2、Render渲染进程 的Renderer接口收到消息,简单解释后,交给渲染线程GUI,然后开始渲染
3、GUI渲染线程接收请求,加载网页并渲染网页,这其中可能需要 Browser主进程 获取资源和需要 GPU进程 来帮助渲染
4、当然可能会有JS线程操作DOM(这可能会造成回流并重绘)
5、最后Render渲染进程 将结果传递给 Browser主进程
6、Browser主进程 接收到结果并将结果绘制出来

为什么JavaScript是单线程?

任务队列【先进先出

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。先执行微任务再执行宏任务
(4)主线程不断重复上面的第三步,不断的去检查任务队列是否有可执行的任务。

事件和回调函数

Event Loop(事件循环,主线程任务全部执行完成再找任务队列是否有任务,如果有,先执行队列中的微任务再执行队列中的宏任务)

宏任务
微任务
//宏任务和微任务例子:
console.log('script start');

setTimeout(function() {
  console.log('setTimeout1');
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

1、整体 script 作为第一个宏任务进入主线程,遇到 console.log,输出 script start。
2、遇到 setTimeout,其回调函数被分发到队列任务中的宏任务队列中。
3、遇到 Promise,其 then函数被分到到队列任务中的微任务队列中,记为 then1,之后又遇到了 then 函数,将其分到队列任务中的微任务队列中,记为 then2。
4、遇到 console.log,输出 script end。
5、此时的队列任务表示为: [ [ then1 , then2 ] , [ setTimeout ]], 再循环执行,输出 promise1 - promise2 - setTimeout,

上一篇 下一篇

猜你喜欢

热点阅读