Skip to content

事件循环

浏览器的进程模型

浏览器是多进程的,主要有以下几个进程:

  1. 主进程:负责协调其他进程,管理浏览器窗口。
  2. 渲染进程:负责渲染页面,解析HTML、CSS、JavaScript等。
  3. 插件进程:负责运行浏览器插件。
  4. GPU进程:负责处理GPU相关的任务。
  5. 网络进程:负责处理网络请求。

何为进程

进程是操作系统分配资源的基本单位,每个进程都有自己的内存空间和系统资源。浏览器中的每个标签页都是一个独立的进程,这意味着每个标签页的渲染进程、插件进程、GPU进程等都是独立的。

何为线程

线程是进程的执行单元,一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。浏览器中的每个标签页的渲染进程可以包含多个线程,如GUI线程、渲染线程、JS线程等。

何为进程和线程的区别

进程是操作系统分配资源的基本单位,线程是进程的执行单元。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。进程和线程的区别在于,进程是操作系统分配资源的基本单位,而线程是进程的执行单元。

渲染主线程是如何工作的

任务调度

排队任务调度

  1. 渲染主线程会进入无限循环
  2. 每次循环会看消息队列是否有任务,如果有任务,则取出第一个任务执行。如果消息队列中没有任务,则渲染主线程会进入休眠状态
  3. 其他所有线程可以向消息队列中添加任务,如GUI线程、渲染线程、JS线程等。新任务会排在队列的末尾,如果主线程空闲,则渲染主线程会立即执行新任务

异步

setTimeout
setInterval
Promise
fetch
requestAnimationFrame
...

JS是单线程的,但是浏览器是多线程的,所以JS可以调用浏览器提供的异步API,如setTimeout、setInterval、Promise、fetch、requestAnimationFrame等。从而实现异步编程。

阐述一下事件循环

事件循环又称消息队列,是浏览器中的个机制,负责事件的调度。

根据Chrome的源码,在刚开始时,主线程会进入一个无限循环,当遇到异步任务时,会将其交给其他线程处理,然后继续执行同步任务。当异步任务处理完成后,会将其结果添加到消息队列的末尾,等待主线程的执行。 根据W3C最新的标准,事件不再简单的分为宏任务和微任务,任务具有多种类型,如用户交互事件,延时事件等,主线程会根据任务的类型,将其添加到不同的消息队列中。但每个浏览器必须有一个微任务队列,用于执行微任务。且微任务队列的优先级最高,在每次循环中,主线程会优先执行微任务队列中的任务。