事件循环
浏览器的进程模型
浏览器是多进程的,主要有以下几个进程:
- 主进程:负责协调其他进程,管理浏览器窗口。
- 渲染进程:负责渲染页面,解析HTML、CSS、JavaScript等。
- 插件进程:负责运行浏览器插件。
- GPU进程:负责处理GPU相关的任务。
- 网络进程:负责处理网络请求。
何为进程
进程是操作系统分配资源的基本单位,每个进程都有自己的内存空间和系统资源。浏览器中的每个标签页都是一个独立的进程,这意味着每个标签页的渲染进程、插件进程、GPU进程等都是独立的。
何为线程
线程是进程的执行单元,一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。浏览器中的每个标签页的渲染进程可以包含多个线程,如GUI线程、渲染线程、JS线程等。
何为进程和线程的区别
进程是操作系统分配资源的基本单位,线程是进程的执行单元。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。进程和线程的区别在于,进程是操作系统分配资源的基本单位,而线程是进程的执行单元。
渲染主线程是如何工作的
任务调度
排队
- 渲染主线程会进入无限循环
- 每次循环会看消息队列是否有任务,如果有任务,则取出第一个任务执行。如果消息队列中没有任务,则渲染主线程会进入休眠状态
- 其他所有线程可以向消息队列中添加任务,如GUI线程、渲染线程、JS线程等。新任务会排在队列的末尾,如果主线程空闲,则渲染主线程会立即执行新任务
异步
setTimeout
setInterval
Promise
fetch
requestAnimationFrame
...
JS是单线程的,但是浏览器是多线程的,所以JS可以调用浏览器提供的异步API,如setTimeout、setInterval、Promise、fetch、requestAnimationFrame等。从而实现异步编程。
阐述一下事件循环
事件循环又称消息队列,是浏览器中的个机制,负责事件的调度。
根据Chrome的源码,在刚开始时,主线程会进入一个无限循环,当遇到异步任务时,会将其交给其他线程处理,然后继续执行同步任务。当异步任务处理完成后,会将其结果添加到消息队列的末尾,等待主线程的执行。 根据W3C最新的标准,事件不再简单的分为宏任务和微任务,任务具有多种类型,如用户交互事件,延时事件等,主线程会根据任务的类型,将其添加到不同的消息队列中。但每个浏览器必须有一个微任务队列,用于执行微任务。且微任务队列的优先级最高,在每次循环中,主线程会优先执行微任务队列中的任务。