文章目录
一.进程和线程【了解】
1.什么是进程?
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,
是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
2.什么是线程?
线程是进程当中的一条执行流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。
一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
3.进程和线程的区别
进程是操作系统资源分配的基本单位
线程是处理器任务调度和执行的基本单位(也可以理解为进程当中的一条执行流程)
4.浏览器内核
定义
浏览器内核就是浏览器渲染进程,从接收下载文件后再到呈现整个页面的过程,由浏览器渲染进程负责
主要流程
1、解析HTML文件和CSS文件,加载图片等资源文件,渲染成用户看到的页面
2、执行解析js文件脚本代码
构成
浏览器内核可以分成两部分: 渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎。
- 渲染引擎:
渲染引擎负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),
以及计算网页的显示方式,然后会输出至显示器或打印机。
- JS引擎:
JS 引擎则是解析 Javascript 语言,执行 javascript 语言来实现网页的动态效果。
最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。
主流浏览器的浏览器内核
常见的浏览器内核可以分为四种:Trident,Gecko,Webkit,Chromium/Bink。
对应的浏览器:IE,Mozilla FireFox,Safari,Chrome
二.单线程和多线程
1.什么是单线程?
单线程:同一时间只能干一件事情,前面的代码没有执行结束之前,后面的代码无法执行,javascript的代码都是单线程执行的
2.什么是多线程?
多线程:同一时间可以干多件事情
3.如何理解javascript是单进程的?
javascript作为一门语言,是没有线程的概念的,
正确说法是:JS的执行是单线程的,也就是说JS运行在浏览器中是单线程的
(JS引擎执行JS时只分配了一个线程给它执行,在同一时间只能做同一件事)
因此执行JS时单线程的
三.同步任务和异步任务
1.同步任务(synchronous,经常简称为sync)
顺序执行的任务:
console.log("hello");
console.log("world");
for(var i=0;i<3;i++){
console.log(i);
}
/*
hello
world
0
1
2
*/
2.异步任务(asynchronous,经常简称为async)
setTimeout(()=>{
console.log("hello");
},0);
console.log("world");
/*
world
hello
*/
setTimeout是常见的异步代码,不管写的是是多少毫秒,
都会让下面的同步任务代码先执行结束,再执行定时器中的异步任务
四.任务队列和执行栈以及事件循环【重点】
执行任务的优先级:同步代码>异步代码
任务队列中的任务分为两种任务:同步任务和异步任务
1.什么是执行栈(execution context stack)?
所有的同步任务都在主线程上执行,这样就形成了一个执行栈
2.什么是任务队列(task queue)?
主线程之外,还存在一个任务队列,
只要异步任务有了运行结果,就在任务队列中放置一个事件
3.执行栈中的同步任务都执行完毕时如何处理?
当执行栈中的所有同步任务都执行完毕时,系统就会读取任务队列中的事件,
此时对应的异步任务会结束等待状态,进入执行栈开始执行
4.什么是事件循环(Event Loop)?
执行栈中的所有同步任务都执行完毕时,主线程重复把任务队列中的异步任务读取到执行栈中执行的操作,这个过程叫做事件循环
5.举例和理解
同步任务:早上上班==>中午吃饭–>去饭馆–>回公司
异步任务:早上上班=(点外卖)=>中午吃饭
上面的例子中,同步任务的执行栈有:上班,去饭馆,吃饭,回公司,而异步任务的执行栈只有上班,点外卖,吃饭
也就是说这里的异步任务可以看成是商家接单和骑手配送等流程,
五.异步任务中的宏任务(macrotask )和 微任务(microtask )
宏任务和微任务同属于异步任务,可以看成两种异步形态,
1.常见宏任务的方法
- script
- 定时器和延时器
2.常见微任务的方法
- Promise.resolve()
- nextTick()
3.执行顺序
微任务>宏任务
4.示例:同步任务和异步任务,宏任务和微任务的执行顺序
setTimeout(() => {//定时器是宏任务
console.log('异步代码-宏任务');
}, 0)
new Promise((resolve) => {
console.log('同步代码1')
resolve('异步代码-微任务')//Promise的resolve()方法是微任务
}).then((res) => {
console.log(res);
})
console.log('同步代码2');
/*
同步代码1
同步代码2
异步代码-微任务
异步任务-宏任务
*/
六.总结
任务队列中的任务分为同步任务和异步任务,先执行同步任务,再执行异步任务
异步任务又分为宏任务和微任务,先执行微任务,再执行宏任务