是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
进程 和 线程
是cpu工作时间片的一个描述
cpu在某个时间端内干的事情就可以用进程和线程表示
进程cpu在运行某个指令加载某段程序和保存上下文所需要的时间
进程:描述了cpu在运行指令及加载和保存上下文所需要的时间
线程:是进程中更小的一个单位 描述执行一段指令所需的时间
当我们在浏览器中新增一个页面是就添加了一个进程
渲染线程 js引擎也是一个线程-》获取图片 背景图-》http请求线程
当使用完毕后线程可能就会被消灭掉
js单线程带来什么好处?
如果同一时间点有多个线程同时执行,效率就会更高
单线程就是一步一步来 有先后顺序
在js中很多东西的执行就是一步一步来的
多线程阻塞ui的渲染
js引擎在js运行时会阻塞ui的渲染(渲染引擎的工作) ==》 js引擎线程 和渲染线程是互斥的
因为js可以修改dom结构,如果在js执行的时候ui线程还在工作,就可能导致不安全的渲染ui,得益于js是单线程运行的,可以达到节省内存,节约上下文切换的时间 对于硬件设备
执行栈
setTimeout是如何实现的?
页面当中所有的事件在浏览器中执行 称为页面事件 页面事件存在一个执行列表 叫消息队列 这与同步与异步有关
- 浏览器的页面是由消息队列 和 事件循环系统来驱动的
- 渲染线程中所有运行在主线程的任务都需要添加到消息队列
- 事件循环系统会按照顺序执行消息队列里面的任务 解析dom这件事会被添加到消息队列中 当用户调整浏览器页面大小时页面会重新布局 这件事需要时间 这件事会被渲染引擎添加到消息队列中
- 要执行一段异步代码,需要首先将异步添加到消息队列,消息队列里面的任务事按照顺序执行的
event-loop
Task(队列):
microtask 微任务
异步回调:
1. 把异步回调函数封装成一个宏任务,添加到消息队列尾部,当循环系统执行到该任务的时候执行回调函数
2. 执行时机是在主函数执行结束之后,当前宏任务结束之前执行回调函数,这通常以微任务的形式出现(体现)
3. 微任务就是一个需要异步执行的函数,执行时机是在主函数执行结束之后当前宏任务结束之前
macrotask 宏任务
包括
微任务包括:process.nextTick,promise,promise.then,MutationObserver
宏任务包括:script,setTimeout,setInterval,setImmediate,I/O,UI渲染
执行顺序:
- 首先执行同步代码(这属于宏任务)
- 当执行完所有的同步代码后,执行栈为空,查询是否有异步代码需要执行
- 执行所有的微任务
- 当执行完所有的微任务后,如果有必要会渲染页面
- 开始下一轮event-loop,执行宏任务中的<异步代码>