# 事件循环

# 进程

# 进程

程序运行需要自己专属的内存空间,这块内存空间就是进程, 互相独立不共用。

# 线程

有了进程后,就可以运行程序代码。 运行程序代码的"人"称为线程,线程属于进程,一个进程(至少有一个线程,称为主线程)可以有多个线程,用来负责一个个单独的子任务(游戏线程,网络线程等)。

# 浏览器

浏览器是多进程,多线程的应用程序,主要有浏览器进程,网络进程,渲染进程等。

# 浏览器进程

优先启动,浏览器本身展示,用户交互,子进程管理(网络,渲染等)。

# 网络进程

加载网络资源,进行网络通信。

# 渲染进程

会开启渲染主线程,执行HTML,CSS,JS,默认会为每一个标签页开启新的渲染进程。

# 异步

js 是单线程执行,主要是通过渲染主线程执行,当遇到一些需要时间的任务,为了防止线程阻塞,就会交给别的线程去处理,比如计时线程(setTimeout),交互线程(onclick),主线程则继续执行剩余的任务,当其他线程完成的时候,将回调函数包装成任务放到消息队列的末尾,等到主线程完成后加入执行,这就是异步模式。

An image

# 任务

  1. 每一个任务都有类型(TaskType),同一个类型的任务必须在同一个队列,不同类型的任务可以属于不同的队列。
  2. 浏览器必须准备好一个微队列任务(microtask queue),优先级最高。
  3. 最新 W3C 标准已经没有宏任务的说法。
  4. 微队列任务(最高),延时队列任务(中),交互队列任务(高)。(浏览器的主要队列)

# 事件循环过程

  1. 渲染主线程会开启一个无限循环。
  2. 每一次循环会检查消息队列(message queue)中是否有任务存在,如果有,就取出第一个任务执行,执行完一个后进入下一个循环,如果没有,则进入休眠状态。
  3. 其他所有线程(包括其他进程中的线程)都可以随时向消息队列添加任务,如果主线程是休眠,则会唤醒以继续循环获取任务。

# 微队列任务

优先级最高,优先执行,process.nextTickPromise更高。

# process.nextTick

# Promise

# MutationObserver

# 宏任务(已经不采用)

在微任务之后执行,宏任务之间没有优先级,先清空微任务队列,在执行宏任务队列

# setTimeout

# setInterval

# setImmediate

# I/O

Nodejs:主线程是单线程执行,但是存在多线程执行,包括 setTimeout,异步 I/O 事件,垃圾回收,内存优化等。

Cpu 密集不适合用 nodejs:图片处理,大文件读取(内存溢出),大字符串处理。