nginx-0x0A-定时器
nginx-0x0B-事件模型中定时任务的触发时机就需要定时器,换言之定时器的作用就触发定时任务的执行。
1 事件循环
广义上区分系统的事件类型
- 网络事件
- 普通任务
事件循环器的作用就是高效处理网络事件和普通任务
- 如果阻塞式调用复用器,虽然可以及时感知到网络事件就绪,但是可能会错过大量定时任务的期待的执时机
- 因此为了兼顾二者,就要非阻塞式调用系统调用,并且设置超时时间就是最近的一次定时任务执行时间,确保定时任务也可以被及时处理
1 |
|
2 关于定时任务的执行时机
事件循环的主线程
1 |
|
1 |
|
3 定时任务要不要执行的判断标准
每个定时任务都维护上超时时间,每触发定时任务的执行时机就扫描一遍定时任务找到超时时间已经过期的,这些任务就是要执行的
1 |
|
4 关于高精度定时器
可以看到在定时任务的处理中需要依赖系统当前时间来判断定时任务有没有到期,而且系统上还会有很多其他需要使用系统当前时间的地方。可想而知,对于高性能的服务端而言,如果每次需要使用系统当前时间就执行一次系统调用gettimeofday
,这是一笔不小的开销。自然而然就想到要缓存系统时间,定时去更新就行,可以大大减少系统调用次数。
既然用到缓存就一定存在缓存不一致,谁跟谁不一致呢,当需要使用系统时间的时候,从缓存上拿到的系统时间可能跟彼时真正的系统时间存在误差,误差是多大,误差范围就是[0…缓存更新间隔],比如,每隔t更新一次缓存系统时间,那么使用的时候拿到的值可能跟系统时间一样,也可能滞后实际时间t。
所以这个时候要解决的矛盾是: 为了系统系能和时间精度,需要设计一种机制能够支持高精度地更新缓存的系统时间—定时器事件登场。
4.1 注册定时器事件
1 |
|
4.2 定时器事件就绪
1 |
|
4.3 更新缓存时间
1 |
|
关于nginx缓存系统时间可见nginx-0x0C-系统时间
nginx-0x0A-定时器
https://bannirui.github.io/2025/04/09/nginx/nginx-0x0A-定时器/