searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

从浏览器进程线程到事件循环

2023-07-03 07:32:00
15
0

浏览器是一个多进程多线程的程序:浏览器的进程有很多,不同进程会有不同的职责

  • 浏览器进程:浏览器用户界面管理、子进程管理
    • 注意:和页面的渲染不一样)用户界面管理:浏览器进程负责管理浏览器的用户界面,包括地址栏、菜单、工具栏等组件的显示和交互。
  • 网络进程:加载网络资源
  • 渲染进程:负责处理网页的渲染和交互,每个打开的网页通常会有一个独立的渲染进程
      1.  渲染引擎:渲染进程使用浏览器的渲染引擎来解析HTML、CSS和JavaScript,并将网页内容转换为用户可见的图像和交互元素。
      1.  页面渲染:渲染进程将解析好的网页内容转换为一棵渲染树,该树结构表示了网页的可视化布局和元素关系。然后,渲染进程使用绘图引擎将渲染树绘制到屏幕上。
      1.  异步渲染:现代浏览器的渲染进程通常会采用异步渲染的方式,以提高网页的响应速度和用户体验。它会将渲染工作分割成多个小任务,并通过多线程或进程并行处理这些任务。
      1.  交互处理:渲染进程还负责处理用户与网页的交互操作,例如点击链接、滚动页面、输入表单等。它会侦听用户的输入事件,并根据事件触发各种交互行为,例如打开新页面或执行JavaScript代码。
      1.  沙盒环境:为了提高安全性,渲染进程一般会运行在沙盒环境中,与操作系统和其他渲染进程之间有一定的隔离。这样即使一个渲染进程出现崩溃或安全漏洞,也不会对浏览器和其他页面造成太大影响。

默认情况下,浏览器会给每个标签页开启渲染进程,这样不同的标签页不会互相影响

渲染主线程

负责处理渲染进程中的大部分任务和操作,主要包括以下几个方面:

    1.  解析和构建渲染树:主线程负责解析HTMLCSSJavaScript,并通过渲染引擎构建渲染树。渲染树是一种树形结构,描述了网页中各个元素的可视化布局和层级关系。
    1.  布局和绘制:主线程负责计算元素在屏幕上的精确位置和大小,并调用绘图引擎将渲染树绘制到屏幕上。这个过程被称为布局(layout)和绘制(painting)。
    1.  事件处理:主线程侦听用户的交互事件,例如点击、滚动、输入等,并根据事件触发相应的行为和操作。它负责将用户的输入事件传递给正确的元素或JavaScript脚本进行处理。
    1.  JavaScript执行:主线程通过解释和执行JavaScript代码来实现网页的交互和动态功能。它会执行网页中的JavaScript脚本,并根据脚本的逻辑和操作更新渲染树和页面内容。
    1.  网络请求和资源加载:主线程负责处理网页中的网络请求,例如加载HTML、CSS、JavaScript文件,以及下载图片、音频、视频等资源。它会发送请求并接收服务器的响应,然后将资源传递给渲染引擎进行处理和显示。

渲染进程的主线程是单线程的,即一次只能执行一个任务。为了提高网页的响应速度和用户体验,主线程会采用异步操作事件驱动并行处理等技术来优化任务执行顺序和效率。

渲染进程的主线程和其他进程(如网络进程、GPU进程)之间会进行通信和协调,以确保网页的渲染和交互能够顺利进行,并最终呈现给用户一个完整且流畅的网页体验

渲染主线程的任务调度

渲染进程的主线程在调度任务时通常采用事件循环(Event Loop)机制。下面是主线程调度任务的一般流程:

    1.  接收任务:主线程会不断地接收任务,这些任务包括用户交互事件(如点击、滚动)、网络请求、JavaScript脚本执行和渲染等。
    1.  任务队列:主线程将收到的任务推送到不同的任务队列中。常见的任务队列包括用户交互任务队列(user interaction tasks queue)、网络任务队列(network tasks queue)、JavaScript执行任务队列(JavaScript tasks queue)和渲染任务队列(rendering tasks queue)......等。必须要有一个微任务PromiseMutationObserver),这个队列优先级最高
    1.  事件循环:事件循环会不断地从任务队列中取出任务,并按照一定的规则进行调度和执行。通常,事件循环会优先处理用户交互任务,以保证及时响应用户的操作。
    1.  任务执行:当事件循环从任务队列中取出任务时,主线程会执行与该任务相关的操作。例如,处理用户交互任务可能涉及更新页面的渲染树、布局和绘制;执行JavaScript任务则会解析和执行相应的JavaScript代码。
    1.  完成任务:任务执行完成后,主线程会根据任务的特性和结果,将可能产生的新任务推送到对应的任务队列中,为下一次事件循环做准备。

任务的调度顺序并不严格按照进入任务队列的顺序执行,而是根据任务的优先级和特性等进行调度。例如,用户交互任务通常会优先执行,以提供良好的用户体验。此外,浏览器可能会根据性能和资源使用等情况做出一些优化,确保高优先级的任务能够得到及时处理。

0条评论
0 / 1000