首页 > 其他分享 >Chromium 是如何解决队头阻塞问题的

Chromium 是如何解决队头阻塞问题的

时间:2024-01-08 23:01:07浏览次数:24  
标签:优先级 队列 合成 队头 阻塞 任务 消息 任务调度 Chromium

为了解决由于单消息队列而造成的队头阻塞问题,Chromium 团队从 2013 年到现在,花了大量的精力在持续重构底层消息机制。

1、第一次迭代:引入一个高优先级队列

首先在最理想的情况下,我们希望能够快速跟踪高优先级任务,比如在交互阶段,下面几种任务都应该视为高优先级的任务:

  • 通过鼠标触发的点击任务、滚动页面任务;
  • 通过手势触发的页面缩放任务;
  • 通过 CSS、JavaScript 等操作触发的动画特效等任务。

这些任务被触发后,用户想立即得到页面的反馈,所以我们需要让这些任务能够优先与其他的任务执行。要实现这种效果,我们可以增加一个高优级的消息队列,将高优先级的任务都添加到这个队列里面,然后优先执行该消息队列中的任务。最终效果如下图所示:

Chromium 是如何解决队头阻塞问题的_消息队列

我们使用了一个优先级高的消息队列和一个优先级低消息队列,渲染进程会将它认为是紧急的任务添加到高优先级队列中,不紧急的任务就添加到低优先级的队列中。然后我们再在渲染进程中引入一个任务调度器,负责从多个消息队列中选出合适的任务,通常实现的逻辑,先按照顺序从高优先级队列中取出任务,如果高优先级的队列为空,那么再按照顺序从低优级队列中取出任务。

将任务划分为多个不同的优先级,来实现更加细粒度的任务调度,比如可以划分为高优先级,普通优先级和低优先级,最终效果如下图所示:

Chromium 是如何解决队头阻塞问题的_消息队列_02

我们实现了三个不同优先级的消息队列,然后可以使用任务调度器来统一调度这三个不同消息队列中的任务。

现在我们引入了多个消息队列,结合任务调度器我们就可以灵活地调度任务了,这样我们就可以让高优先级的任务提前执行,采用这种方式似乎解决了消息队列的队头阻塞问题。

2、 第二次迭代:根据消息类型来实现消息队列

要解决上述问题,我们可以为不同类型的任务创建不同优先级的消息队列,比如:

  • 可以创建输入事件的消息队列,用来存放输入事件。
  • 可以创建合成任务的消息队列,用来存放合成事件。
  • 可以创建默认消息队列,用来保存如资源加载的事件和定时器回调等事件。
  • 还可以创建一个空闲消息队列,用来存放 V8 的垃圾自动垃圾回收这一类实时性不高的事件。

Chromium 是如何解决队头阻塞问题的_消息队列_03

通过迭代,这种策略已经相当实用了,但是它依然存在着问题,那就是这几种消息队列的优先级都是固定的,任务调度器会按照这种固定好的静态的优先级来分别调度任务。

3、第三次迭代:动态调度策略

根据实际场景来继续平衡这个跷跷板,也就是说在不同的场景下,根据实际情况,动态调整消息队列的优先级。一图胜过千言,我们先看下图:

Chromium 是如何解决队头阻塞问题的_消息队列_04

这张图展示了 Chromium 在不同的场景下,是如何调整消息队列优先级的。通过这种动态调度策略,就可以满足不同场景的核心诉求了,同时这也是 Chromium 当前所采用的任务调度策略。

上图列出了三个不同的场景,分别是加载过程,合成过程以及正常状态。当渲染进程接收到用户交互的任务后,接下来大概率是要进行绘制合成操作,因此我们可以设置,当在执行用户交互的任务时,将合成任务的优先级调整到最高。

接下来,处理完成 DOM,计算好布局和绘制,就需要将信息提交给合成线程来合成最终图片了,然后合成线程进入工作状态。现在的场景是合成线程在工作了,那么我们就可以把下个合成任务的优先级调整为最低,并将页面解析、定时器等任务优先级提升。

4、第四次迭代:任务饿死

不过依然存在一个问题,那就是在某个状态下,一直有新的高优先级的任务加入到队列中,这样就会导致其他低优先级的任务得不到执行,这称为任务饿死。Chromium 为了解决任务饿死的问题,给每个队列设置了执行权重,也就是如果连续执行了一定个数的高优先级的任务,那么中间会执行一次低优先级的任务,这样就缓解了任务饿死的情况。


标签:优先级,队列,合成,队头,阻塞,任务,消息,任务调度,Chromium
From: https://blog.51cto.com/key3feng/9151938

相关文章

  • Kafka消息阻塞:拯救面试的八大终极解决方案!
    大家好,我是小米,一个对技术充满热情的90后程序员。最近在准备社招面试的过程中,遇到了一个超级有挑战性的问题:“Kafka消息阻塞怎么解决?”今天,我就来和大家一起深入剖析这个问题,分享我在解决过程中的心得和经验。认识Kafka消息阻塞首先,我们得了解一下Kafka消息阻塞是什么?简单来说,Kafka......
  • Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)
    MozillaFirefox,GoogleChrome,Chromium,AppleSafari作者主页:www.sysin.org天下只剩三种(主流)浏览器:AppleSafariMozillaFirefoxGoogleChrome(Chromium)【国外各种(MicrosoftEdge、Opera…),国产各种…】Safari下载:AppleSafari16.3-macOS专属浏览器(独立安装包下载)如何屏......
  • Firefox 120, Chrome 120, Chromium 120 官网离线下载 (macOS, Linux, Windows)
    Firefox120,Chrome120,Chromium120官网离线下载(macOS,Linux,Windows)MozillaFirefox,GoogleChrome,Chromium,AppleSafari作者主页:sysin.org天下只剩三种(主流)浏览器:AppleSafariMozillaFirefoxGoogleChrome(Chromium)【国外各种(MicrosoftEdge、Opera…),国产各种…】......
  • java.io.FileInputStream#read(byte[]) 阻塞导致没办法继续执行的问题处理
    在对设备节点进行操作的时候,发现读的时候进入阻塞状态(可能是设备节点异常),导致没办法继续执行后面的代码 查看了一下,文件的方式读,是没办法配置超时的自动报异常的设计了一段代码,针对读阻塞做异常处理 publicstaticStringsendCmdToFile(StringfromFile,Stringcmd......
  • boost beast http::read 一直阻塞不返回,问题解决, 使用parser对象的skip(true) 来解
    用beast作为客户端发送http请求后读web服务端返回的数据,遇到了http::read或http::async_read一直阻塞着,不返回,直到连接过期后被强制网络断开后read函数才返回。看了官方文档,文档里这么描述的,read要一直等到end_of_stream时才回退出阻塞状态。也就是连接失效后才行。但我们的......
  • 阻塞队列linkedBlockQuene和syncroBlockQuene的区别?
    在Java中,LinkedBlockingQueue和SynchronousQueue是两种不同类型的阻塞队列,它们有一些关键的区别:实现机制:LinkedBlockingQueue使用一个链表实现的有界或无界队列。有界队列的容量是固定的,而无界队列的容量理论上是无限的。SynchronousQueue是一个特殊的阻塞队列,它在内部......
  • 自定义session Provider随笔[由多个请求阻塞排队处理发现]
    引用:Session,有没有必要使用它?usingIDH.Common.BaseInfoCacheManagement;usingNewtonsoft.Json;usingSystem;usingSystem.Collections.Generic;usingSystem.Collections.Specialized;usingSystem.Web;usingSystem.Web.SessionState;namespaceIdhWebApplication.E......
  • 【FreeRTOS】阻塞机制:任务调度的默契与优雅
    在实时操作系统(RTOS)的领域中,任务的协同合作和优雅调度是确保系统稳定性和高效性的关键因素之一。FreeRTOS作为一款广泛应用的RTOS,其阻塞机制提供了一种有力的工具,用于实现任务之间的协作与调度。本文将深入探讨FreeRTOS中的阻塞机制,介绍其概念、用法,并通过详细的代码演示来展示任务......
  • 阻塞队列之 LinkedBlockingQueue
    LinkedBlockingQueue:Java多线程编程中的阻塞队列在Java多线程编程中,LinkedBlockingQueue是一个非常重要的类,它提供了一种用于在生产者和消费者之间进行数据传递的机制。LinkedBlockingQueue广泛应用于各种场景,如线程池、任务队列等。本文将详细介绍LinkedBlockingQueue的原理......
  • 02-简单的C/S阻塞模型
    C/S阻塞模型是指客户端/服务器阻塞模型,它描述了一种基于阻塞的网络通信方式。在阻塞模型中,客户端发送请求给服务器,并等待服务器的响应。在等待服务器响应的过程中,客户端的操作会被阻塞,直到服务器响应返回或超时。服务器服务器基本流程如下:启动网络库创建服务器Socket绑定服......