当前位置:首页 > 科技  > 软件

面试官:说说延迟任务的时间轮调度算法?

来源: 责编: 时间:2024-06-05 17:42:22 260观看
导读本文继续讨论 Netty 相关的面试题,今天咱们来看一道 Netty 中的高频面试题:说说 Netty 延迟任务的时间轮调度算法?Netty 框架是以性能著称的框架,因此在它的框架中使用了大量提升性能的机制,例如 Netty 用于实现延迟队列的

Ctl28资讯网——每日最新资讯28at.com

本文继续讨论 Netty 相关的面试题,今天咱们来看一道 Netty 中的高频面试题:说说 Netty 延迟任务的时间轮调度算法?Ctl28资讯网——每日最新资讯28at.com

Netty 框架是以性能著称的框架,因此在它的框架中使用了大量提升性能的机制,例如 Netty 用于实现延迟队列的时间轮调度算法就是一个典型的例子。使用时间轮算法可以实现海量任务新增和取消任务的时间度为 O(1),那么什么是时间轮调度算法呢?接下来我们一起来看。Ctl28资讯网——每日最新资讯28at.com

1.延迟任务实现

在 Netty 中,我们需要使用 HashedWheelTimer 类来实现延迟任务,例如以下代码:Ctl28资讯网——每日最新资讯28at.com

public class DelayTaskExample {    public static void main(String[] args) {        System.out.println("程序启动时间:" + LocalDateTime.now());        NettyTask();    }    private static void NettyTask() {        // 创建延迟任务实例        HashedWheelTimer timer = new HashedWheelTimer(3, // 间隔时间                TimeUnit.SECONDS, // 间隔时间单位                100); // 时间轮中的槽数        // 创建任务        TimerTask task = new TimerTask() {            @Override            public void run(Timeout timeout) throws Exception {                System.out.println("执行任务时间:" + LocalDateTime.now());            }        };        // 将任务添加到延迟队列中        timer.newTimeout(task, 0, TimeUnit.SECONDS);    }}

以上程序的执行结果如下:Ctl28资讯网——每日最新资讯28at.com

程序启动时间:2024-06-04T10:16:23.033Ctl28资讯网——每日最新资讯28at.com

执行任务时间:2024-06-04T10:16:26.118Ctl28资讯网——每日最新资讯28at.com

从上述执行结果可以看出,我们使用 HashedWheelTimer 实现了延迟任务的执行。Ctl28资讯网——每日最新资讯28at.com

2.时间轮调度算法

那么问题来了,HashedWheelTimer 是如何实现延迟任务的?什么是时间轮调度算法?Ctl28资讯网——每日最新资讯28at.com

查看 HashedWheelTimer 类的源码会发现,其实它是底层是通过时间轮调度算法来实现的,以下是 HashedWheelTimer 核心实现源码(HashedWheelTimer 的创建源码)如下:Ctl28资讯网——每日最新资讯28at.com

private static HashedWheelBucket[] createWheel(int ticksPerWheel) {    // 省略其他代码    ticksPerWheel = normalizeTicksPerWheel(ticksPerWheel);    HashedWheelBucket[] wheel = new HashedWheelBucket[ticksPerWheel];    for (int i = 0; i < wheel.length; i ++) {        wheel[i] = new HashedWheelBucket();    }    return wheel;}private static int normalizeTicksPerWheel(int ticksPerWheel) {    int normalizedTicksPerWheel = 1;    while (normalizedTicksPerWheel < ticksPerWheel) {        normalizedTicksPerWheel <<= 1;    }    return normalizedTicksPerWheel;}private static final class HashedWheelBucket {    private HashedWheelTimeout head;    private HashedWheelTimeout tail;    // 省略其他代码}

在 HashedWheelTimer  中,使用了 HashedWheelBucket 数组实现时间轮的概念,每个 HashedWheelBucket 表示时间轮中一个 slot(时间槽),HashedWheelBucket 内部是一个双向链表结构,双向链表的每个节点持有一个 HashedWheelTimeout 对象,HashedWheelTimeout 代表一个定时任务,每个 HashedWheelBucket 都包含双向链表 head 和 tail 两个 HashedWheelTimeout 节点,这样就可以实现不同方向进行链表遍历,如下图所示:Ctl28资讯网——每日最新资讯28at.com

Ctl28资讯网——每日最新资讯28at.com

时间轮算法的设计思想就来源于钟表,如上图所示,时间轮可以理解为一种环形结构,像钟表一样被分为多个 slot 槽位。每个 slot 代表一个时间段,每个 slot 中可以存放多个任务,使用的是链表结构保存该时间段到期的所有任务。时间轮通过一个时针随着时间一个个 slot 转动,并执行 slot 中的所有到期任务。Ctl28资讯网——每日最新资讯28at.com

任务的添加是根据任务的到期时间进行取模,然后将任务分布到不同的 slot 中。如上图所示,时间轮被划分为 8 个 slot,每个 slot 代表 1s,当前时针指向 2 时,假如现在需要调度一个 3s 后执行的任务,应该加入 2+3=5 的 slot 中;如果需要调度一个 12s 以后的任务,需要等待时针完整走完一圈 round 零 4 个 slot,需要放入第 (2+12)%8=6 个 slot。Ctl28资讯网——每日最新资讯28at.com

那么当时针走到第 6 个 slot 时,怎么区分每个任务是否需要立即执行,还是需要等待下一圈 round,甚至更久时间之后执行呢?所以我们需要把 round 信息保存在任务中。例如图中第 6 个 slot 的链表中包含 3 个任务,第一个任务 round=0,需要立即执行;第二个任务 round=1,需要等待 1*8=8s 后执行;第三个任务 round=2,需要等待 2×8=8s 后执行。所以当时针转动到对应 slot 时,只执行 round=0 的任务,slot 中其余任务的 round 应当减 1,等待下一个 round 之后执行。Ctl28资讯网——每日最新资讯28at.com

可以看出时间轮有点类似 HashMap,如果多个任务如果对应同一个 slot,处理冲突的方法采用的是拉链法。在任务数量比较多的场景下,适当增加时间轮的 slot 数量,可以减少时针转动时遍历的任务个数。Ctl28资讯网——每日最新资讯28at.com

时间轮定时器最大的优势就是,任务的新增和取消都是 O(1) 时间复杂度,而且只需要一个线程就可以驱动时间轮进行工作。Ctl28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-92120-0.html面试官:说说延迟任务的时间轮调度算法?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 利用Spring Boot和Elasticsearch进行人脸数据的高效检索

下一篇: 微服务下认证授权框架的探讨

标签:
  • 热门焦点
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 机构称Q2国内智能手机销量同比下滑4% vivo份额重回第1

    7月29日消息,根据市场调查机构Counterpoint Research公布的最新报告,2023年第2季度中国智能手机销量同比下降4%,创新自2014年以来第2季度销量新低。报
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top