什么是时间轮_轮转时间片

什么是时间轮_轮转时间片在上一篇文章中我们讲解了空闲检测机制的由来, `Netty`对应的心跳实现以及源码查看, 本次主要讲解什么是时间轮

「我正在参与掘金会员专属活动-源码共读第一期,点击参与

前言

在上一篇文章中我们讲解了空闲检测机制的由来, Netty对应的心跳实现以及源码查看, 本次主要讲解什么是时间轮

这是我的Netty专栏 欢迎大家关注

时间轮

时间轮是一种实现延迟功能的算法, 它在Linux内核中使用广泛, 是Linux内核定时器的实现方法和基础之一.

时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型, 把大量的调度任务全部绑定到同一个调度器上, 利用这个调度器来进行所有任务的管理, 触发以及运行.

单层时间轮

image.png

图片来源于网络

时间轮的创意来自于生活中的时钟, 在时间轮机制中有时间槽和时间轮的概念, 对应的分别是时钟的刻度和时针跳动的一个周期, 当有新任务产生的时候, 会将任务放置到对应的时间槽内, 每过一个时间周期就会执行下一个时间槽内的任务

image.png

图片来源于网络

多层时间轮

但是在上述时间轮也有一些缺点, 假设每个时间周期是 1s, 时间轮共有六十个节点, 那么当我设置一个任务为 70s 之后执行的话会在 10s(70 % 60) 后执行, 这显然不符合我们的预期

所以在时间爱轮中还有一个参数 round, 用来记录几圈之后执行

当我们解决了时间轮圈数问题之后就会发现, 只有当一个任务的 round 为 0 才会执行该任务, 那么就会造成时间轮的空转问题, 还是上面刻度为 60 的时间轮, 假设一个任务在 600s 后执行, 则该任务的执行刻度为 0s, round 为 10, 时间轮空转 10 圈才会执行该任务, 造成了大量资源的浪费, 于是多层时间轮应运而生

image.png

图片来源于网络

如图所示, 第一层时间跨度为 1ms, 第二层时间跨度为 20ms, 第三层时间跨度为 400ms, 当任务为 501ms 执行的时候, 会先记录在 刻度为 1(501/400) 的地方, 当执行到 1 时, 余下的 101(501-400) 会进入第二层的 1(101/20) 刻度, 同时 round == 5, 代表五圈后的 1 刻度, 执行完第二层之后, 还余 1 会进入第三层的 1 刻度, 至此才算是结束

使用场景

kafka , Netty, Zookeeper 等高并发的一般都有时间轮的实现

Netty系统为例, 在其中是会存在大量连接的, 在每个连接中都存在相应的事件任务, 而大量的事件任务如果每一个任务都启动一个timer调度器来管理任务的生命周期的话, 会造成CPU的资源浪费且低效, 于是HashedWheelTimer应运而生, HashedWheelTimer就是以时间轮为基础进行设计的

参考

浅析时间轮 – 掘金 (juejin.cn)

本文内容到此结束了

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。

如有错误❌疑问💬欢迎各位大佬指出。

我是 宁轩 , 我们下次再见

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13721.html

(0)

相关推荐

  • GaussDB for DWS:内存自适应控制技术总结

    GaussDB for DWS:内存自适应控制技术总结1.技术背景 在SQL语句复杂、处理数据量大的AP场景下,单个查询对内存的需求越来越大,多个语句的并发很容易将系统的内存吃满,造成内存不足的问题。为了应对这种问题,GaussDB for DWS引入…

    2023-03-20
    152
  • Python zip函数用法详解

    Python zip函数用法详解在Python编程中,经常需要处理多个序列或者列表,例如,同时遍历列表A和列表B,对它们进行一些操作,或将两个列表合并为一个。此时,Python内置的zip()函数就能够派上用场。本文将详细介绍Python的zip函数的用法,包括什么是zip函数,zip函数的参数与返回值,如何在Python2和Python3中使用zip函数以及一些常见的实例应用。

    2024-04-30
    77
  • hbase客户端工具_cdh安全

    hbase客户端工具_cdh安全集群版本:CDH6.2.0集群Hadoop版本:Hadoop 3.0.0-cdh6.2.0集群HBase版本:2.1.0-cdh6.2.0 操作系统:macOS 10.15.5 IntelliJ ID

    2023-03-11
    140
  • Graphical User Interface as a Reflection of the Real World: Shadows and Elevation

    Graphical User Interface as a Reflection of the Real World: Shadows and Elevation界面设计从拟物化到扁平化,看似发生了天翻地覆的变化,其实一些核心的原则一直都在贯穿始终,比如跟现实世界的映射。 我们生活在一个三维的物理空间中,我们所感知到的事物皆是以此为基础,那么即使在二维的物理屏幕上,我们也会潜意识的按照生活中的经验去进行认知。所以界面设计是否拟物是否扁平都不是最重要的,重要的是我们如何将这种空间层次的感觉传递给使用者。

    2023-08-15
    105
  • as的sdk环境怎么配置_安卓sdk环境变量配置

    as的sdk环境怎么配置_安卓sdk环境变量配置Isaac 是 NVIDIA 开放的机器人平台。其 Isaac SDK 包括以下内容: Isaac Apps: 各种机器人应用示例,突出 Engine 特性或专注 GEM 功能等

    2023-07-19
    122
  • 《推荐系统实践》pdf「建议收藏」

    《推荐系统实践》pdf「建议收藏」随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载(information overload)的时代 。在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:对于信息消费者,从大量信息中找到自己感兴趣的信息是一件非常困难的事情;对于信息生产者,让自己生产…

    2023-08-20
    118
  • Python中神奇的切片技巧:轻松操作列表和字符串

    Python中神奇的切片技巧:轻松操作列表和字符串Python是一门强大的编程语言,具有极高的灵活性和可读性。其中,strong切片技巧/strong是它的一大亮点之一。通过对字符串和列表进行切片操作,不仅能够轻松地访问特定区间的元素,还能进行一些灵活的、高效的数据处理。

    2024-03-10
    81
  • JavaScript中向数组指定位置添加元素

    JavaScript中向数组指定位置添加元素对于开发者来说,在JavaScript中向数组指定位置添加元素是很常见的操作。实现这个功能,可以使用JavaScript内置的splice()方法完成。该方法可以接收3个参数:index(指定位置的下标)、howMany(需要删除的元素个数)和element1、element2、……、elementN(需要添加的元素)。因此,本文将详细阐述在JavaScript中实现向数组指定位置添加元素的方法,以及如何正确地使用splice()方法。

    2024-04-18
    69

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注