一. JS的单线程和浏览器的多线程
1. 我们先说一下进程:
进程:
学术上说,进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
我们这里将进程比喻为工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
2. 什么是线程?什么是单线程?什么是多线程?
线程是:程序中一个单一的顺序控制流程。每个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元。这里把线程比喻一个车间的工人,即一个车间可以允许由多个工人协同完成一个任务。
多线程是:在单个程序中同时运行多个线程完成不同的工作。
3.进程和线程的区别和关系
进程是操作系统分配资源的最小单位,线程是程序执行的最小单位。
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)。
调度和切换:线程上下文切换比进程上下文切换要快得多。
4.js的单线程
js是单线程,指的是js在运行时,同一个时间只能处理一个事情。因此才有了事件队列的概念,前一个任务结束后才会执行下一个任务。
二. EventLoop
JS主线程不断的循环往复的从任务队列中读取任务,执行任务,这种运行机制称为事件循环(EventLoop)
三. 微任务(microtask)和宏任务(macrotask)
微任务和宏任务是异步任务的一种类型,微任务的优先级要高于宏任务,下面是它们所包含的api:
微任务:
- process.nextTick
- promise
- MutationObserver
宏任务:
- setTimeout
- setImmerdiate
- setInterval
- I/O
- UI 渲染
EventLoop与宏任务和微任务的关联
1、每一个event loop 都有一个微任务 queue
2、每一个event loop 会有一个或多个宏任务 queue(列队) ( 也可以称为task queue )
3、一个任务 task 可以放入 macrotask queue 也可以放入 microtask queue中
4、每一次event loop,会首先执行 微任务 queue, 执行完成后,会提取 宏任务 queue 的一个任务加入 微任务 queue, 接着继续执行微任务queue,依次执行下去直至所有任务执行结束。
可看图理解下
先执行一个主任务,然后执行所有微任务,执行完后如果event loop还是检测到微任务(比如一个微任务内又创建了一个微任务),仍然执行微任务,检测出没有微任务,我们就执行一个宏任务,依此循环。