定时器
文章平均质量分 71
birate_小小人生
专注,自信,坚持
展开
-
定时器系列3 - 时间轮
以钟表的背景来描述时间轮的运转,时间轮每走一格,就像表钟刻度走一下。 ++tick 60;每秒钟 ++tick 来描述秒针移动;对 让秒针永远在 [0, 59]间移动; 对于时钟来说,它的时间精度(最⼩运⾏单元)是1秒; 时间轮的设计 1. 准备一个数组存储连接数据;那么数组长度设置为多少? 参照时钟表盘的运转规律,可以将定时任务根据触发的紧急程度,分布到不同层级的时间轮中;假设时间精度为 10ms ;在第 1 层级每 10ms 移动⼀格;每移动⼀格执⾏该格⼦当中所有的定时任务;当第 1 层指针从 255原创 2021-10-10 23:46:06 · 463 阅读 · 0 评论 -
定时器系列2 -最小堆
概念 满二叉树: 所有的层节点数都是该层所能容纳节点的最⼤数量(满足 2n2^n2n; n>=0n > =0n>=0) ; 完全二叉树: 若⼆叉树的深度为 h ,除了 h 层外,其他层的节点数都是该层所能容纳节点的最⼤数量(满⾜ ),且 h 层都集中在最左侧; 最小堆: 是一颗完全二叉树; 某一个节点的值总是小于等于它的子节点的值; 堆中每个节点的子树都是最小堆; 增加操作 为了满⾜完全⼆叉树定义,往⼆叉树最⾼层沿着最左侧添加⼀个节点;然后考虑是否能上升操作;如果此时添加值为 4 的原创 2021-10-10 18:52:19 · 348 阅读 · 0 评论 -
定时器系列1-红黑树
对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件; 在不同框架中,这两种事件有不同的实现⽅式; 第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、 redis; // 第⼀种 while (!quit) { int now = get_now_time();// 单位: ms int timeout = get_nearest_timer() - now; if (timeout < 0) timeout = 0; int nevent = epoll_原创 2021-09-15 22:29:21 · 265 阅读 · 0 评论