# 事件循环
# 进程
# 进程
程序运行需要自己专属的内存空间,这块内存空间就是进程, 互相独立不共用。
# 线程
有了进程后,就可以运行程序代码。 运行程序代码的"人"称为线程,线程属于进程,一个进程(至少有一个线程,称为主线程)可以有多个线程,用来负责一个个单独的子任务(游戏线程,网络线程等)。
# 浏览器
浏览器是多进程,多线程的应用程序,主要有浏览器进程,网络进程,渲染进程等。
# 浏览器进程
优先启动,浏览器本身展示,用户交互,子进程管理(网络,渲染等)。
# 网络进程
加载网络资源,进行网络通信。
# 渲染进程
会开启渲染主线程,执行HTML,CSS,JS,默认会为每一个标签页开启新的渲染进程。
# 异步
js 是单线程执行,主要是通过渲染主线程执行,当遇到一些需要时间的任务,为了防止线程阻塞,就会交给别的线程去处理,比如计时线程(setTimeout),交互线程(onclick),主线程则继续执行剩余的任务,当其他线程完成的时候,将回调函数包装成任务放到消息队列的末尾,等到主线程完成后加入执行,这就是异步模式。

# 任务
- 每一个任务都有类型(TaskType),同一个类型的任务必须在同一个队列,不同类型的任务可以属于不同的队列。
- 浏览器必须准备好一个微队列任务(microtask queue),优先级最高。
- 最新 W3C 标准已经没有宏任务的说法。
- 微队列任务(最高),延时队列任务(中),交互队列任务(高)。(浏览器的主要队列)
# 事件循环过程
- 渲染主线程会开启一个无限循环。
- 每一次循环会检查消息队列(message queue)中是否有任务存在,如果有,就取出第一个任务执行,执行完一个后进入下一个循环,如果没有,则进入休眠状态。
- 其他所有线程(包括其他进程中的线程)都可以随时向消息队列添加任务,如果主线程是休眠,则会唤醒以继续循环获取任务。
# 微队列任务
优先级最高,优先执行,process.nextTick比Promise更高。
# process.nextTick
# Promise
# MutationObserver
# 宏任务(已经不采用)
在微任务之后执行,宏任务之间没有优先级,先清空微任务队列,在执行宏任务队列
# setTimeout
# setInterval
# setImmediate
# I/O
Nodejs:主线程是单线程执行,但是存在多线程执行,包括 setTimeout,异步 I/O 事件,垃圾回收,内存优化等。
Cpu 密集不适合用 nodejs:图片处理,大文件读取(内存溢出),大字符串处理。
← TypeScript 挑战 npm →