终于给Silly的定时器增加了取消功能
💡
原文中文,约3600字,阅读约需9分钟。
📝
内容提要
silly是一个基于Lua的高并发网络框架,最近为了增加etcd支持,作者决定给定时器增加取消功能。作者使用内存池解决session到node指针的映射问题,通过计算偏移量反向推理出对应的node指针的值。作者还优化了代码,利用浪费的4字节减少闭包的创建,降低代码重复度,优化性能。整个数据结构包括node、page、pool、slot_root和slot_level。
🎯
关键要点
- silly是一个基于Lua的高并发网络框架,采用类似Linux内核时间轮的方式实现定时器。
- 作者决定为定时器增加取消功能,以简化超时逻辑的实现。
- 实现O(1)删除的唯一方案是双向链表,但根据session找到node指针的方式存在复杂性。
- 作者考虑使用内存池来解决session到node指针的映射问题,避免使用哈希表的复杂度。
- 通过计算node指针的偏移量生成唯一session,实现了高效的映射。
- 内存池采用page数组结构,扩容时只需malloc一个page,简化了实现复杂度。
- 增加version字段以避免session的重复使用,提高了业务逻辑的容忍度。
- 优化了timeout函数的使用方式,减少了闭包的创建,提高了性能。
- 通过维护timer_user_data数组,避免了频繁的rehash操作,提升了效率。
➡️