|游戏服务器定时任务是通过什么样的方式实现呢?

|游戏服务器定时任务是通过什么样的方式实现呢?

文章图片


如果是linux服务器下 , 提供两种编码比较简单的常见方案 , 抛砖引玉:
一种是使用内核提供的定时器功能 , 定时精度可达纳秒级(当然普通硬件的纳秒级几乎不可靠):

通过timerfd_create(2)函数创建一个定时器描述符 , 在flags参数里设置非阻塞和exec后关闭 , 然后设置好定时间隔和是否只执行一次之后 , 把描述符加入到epoll的事件驱动系统里 , 当epoll_wait返回该描述符可读时 , 说明定时器到点 , 可以执行回调任务函数了 。
另一种类似的常见定时器实现是 , 通过select/epoll_wait函数的超时功能 , 同时定义定时任务节点 , 用一个最小单位间隔时间设置timeval结构体 , 传入事件驱动主循环中select/epoll_wait的阻塞时间参数 。 这种实现方法的关键是要设计好一个管理定时任务节点的数据结构 , 尽可能地减少执行定时任务和增删定时任务的时间复杂度 , 保证最快到点的时间最先弹出数据结构容器 , 执行任务回调函数 。 常见的数据结构容器有 , 按到点时间排序的有序链表 , 最小时间堆等 。 这种方式精度为微秒级 。

【|游戏服务器定时任务是通过什么样的方式实现呢?】这两种方案的共同优点是 , 定时任务处理和普通网络socket读写事件处理都能使用同一个I/O多路复用机制 , 提升服务器负载能力 , 避免了另开线程 。 严重不推荐通过alarm函数或sleep函数来实现的定时功能 。 原因很简单:一 , 定时精度不够;二 , 线程大部分时间处于睡觉状态 , 程序性能 , cpu使用率低下 。