thttpd源码解析 定时器模块

来源:互联网 发布:淘宝哪种付款方式最快 编辑:程序博客网 时间:2024/04/29 21:42

thttpd源码解析 定时器模块

  • thttpd是非常轻量级的http服务器,可执行文件仅50kB。名称中的第一个t表示tiny, turbo, 或throttling
  • 与lighttpd、memcached、redis相比非常小巧,仅有不到8k行,而后三者大小分别为:60k,13k,86k
  • 支持HTTP/1.1和CGI;采用IO复用实现,单线程,可移植;实现了基于URL的文件流量限制功能
  • 特别适用于大量静态数据访问的场景,如图片存储
  • 2004年已经停止维护,有一个关于X-Forwarded-For HTTP header的bug。后来出现stthhpd基于此项目
  • 性能比较参考对比
  • 本文针对timer模块进行分析

timer模块

  • 包括timer.h,timer.c两个文件
  • 使用全局开放式散列表,默认大小67,每个hash节点上的值按照时间顺序排列
  • ClientData定义如下:
    typedef union {  void* p;  int i;  long l;  } ClientData;
  • TimerProc类型声明如下:void TimerProc( ClientData client_data, struct timeval* nowP )。函数将在定时器超时时调用
  • Timer结构定义如下:
    typedef struct TimerStruct {  TimerProc* timer_proc;  ClientData client_data;  long msecs;  int periodic;  struct timeval time;  struct TimerStruct* prev;  struct TimerStruct* next;  int hash;  } Timer;
  • void tmr_init( void )
    • 初始化定时器包,即定时器hash表
  • Timer* tmr_create( struct timeval* nowP, TimerProc* timer_proc, ClientData client_data, long msecs, int periodic )
    • 创建一个定时器,指定是一次性/周期性,加入散列表
    • 定时器的时间设置为nowP的时刻加上msecs毫秒之后,若nowP为0,设置为当前时刻加上msecs毫秒
  • timeval* tmr_timeout( struct timeval* nowP )
    • 返回到下次触发的时间间隔
    • 调用tmr_mstimeout得到
  • tmr_mstimeout( struct timeval* nowP )
    • 返回到下次触发时间间隔的毫秒数,即从nowP开始,经过多少毫秒hash表中会有一个定时器触发
    • 因为hash表中的每个链表都是有序的,遍历一次hash表即可
  • void tmr_run( struct timeval* nowP )
    • 遍历hash表,如果定时器没有超时,调用timer_proc
    • 如果定时器是周期性的,则调用后时间后延msecs,如果是非周期性的,则调用tmr_cancel去除
  • void tmr_reset( struct timeval* nowP, Timer* timer )
    • 重新开始运行定时器,时钟设置为当前时间nowP加上定时时长
  • void tmr_cancel( Timer* timer )
    • 释放定时器,由于tmr_run中对所有非周期性定时器都已经调用tmr_cancel,用户无需再自己对非周期定时器调用
    • 将timers加入free_timers链表,节省free和malloc的开销,相当于一个缓冲池
  • void tmr_cleanup( void )
    • 清空定时器包,释放所有无用的内存:free_timers链表
  • void tmr_destroy( void )
    • 调用tmr_cancel释放所有定时器,为退出做准备,
  • void tmr_logstats( long secs )
    • 生成调试log信息,记录当前已分配、使用中、free的定时器个数
  • 操作hash表的静态函数
    • hash:由(time.tv_sec ^ time.tv_usec) % 67得到hash值
    • l_add:插入一个定时器
    • l_remove:移除一个定时器
    • re_sort:定时器结构体含有之前的hash值,如果定时器的值改变,移除后重新计算hash,插入到正确的位置

timer模块的使用

  • 在main函数中使用类timer模块
  • 调用tmr_init初始化
  • 创建周期为OCCASIONAL_TIME的周期定时器,回调函数为occasional
  • 创建周期为5s的周期定时器,回调函数为idle
  • 创建周期为THROTTLE_TIME的周期定时器,回调update_throttles
  • 创建周期为STATS_TIME的周期定时器,回调show_stats
  • 在主要事件处理循环中:
    • 如果没有socket发生事件,调用一次tmr_run,continue
    • 如果有新连接,continue,以保证新连接优先得到处理
    • 如果有事件发生,则处理事件
    • 运行一次tmr_run
  • occasional
    • 调用mmc_cleanup
    • 调用tmr_cleanup,清除无用的定时器内存池
    • 设置watchdog_flag = 1,使watchdog知道程序仍在运行
  • idle
  • update_throttles 更新流量控制
  • show_stats
    • 调用函数logstats,记录信息
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 如何更改微信登录密码忘记了怎么办 阿里卖家不肯同意退货退款怎么办 新买的号码被绑定微信怎么办 如果换手机原来旧手机支付宝怎么办 支付宝注册证件已过有效期怎么办 支付宝账号是手机号换号怎么办 淘宝网卖假药伤了别人身体怎么办 微信手机登录收不到验证码怎么办 淘宝店的宝贝没有尺码选项怎么办 淘宝账号被保护要自助开通怎么办 小米平板经常出现系统无响应怎么办 淘宝买家被取消运费险了怎么办 新开的淘宝直播店没有流量怎么办 淘宝买的东西一直不发货怎么办 在淘宝上买了东西不发货怎么办 宝贝好几天拉一次吃的也少怎么办 淘宝快递正在运输途中想退货怎么办 淘宝买的东西退货商家拒收怎么办 手机屛上出现了微信图标怎么办 手机用了两年了反应太慢怎么办 魅族手机显示手机已锁定怎么办 为什么微信注册要安全验证码怎么办 微信帐号异常无法领取红包怎么办 帮朋友代付在支付宝被骗怎么办 商家说未收到货拒绝退款怎么办 淘宝商家拒绝退款怎么办还没收货的 拼多多点错确认收货了怎么办 被别人用菜刀砍伤没钱看病怎么办 东京下了订单但不发货怎么办 绑定卷皮钱包的手机号码丢了怎么办 小孩回奶在垫的被子上发霉了怎么办 2个月宝宝不喝母乳只喝奶瓶怎么办 我的扣扣被盗了朋友别被骗了怎么办 我买的股票退市了我的钱怎么办啊 在美食林被门口买宝石的骗了怎么办 在商场买的彪马鞋子皮子裂了怎么办 手机换号了京东钱包里的余额怎么办 寄报销发票给顺丰快递搞丢了怎么办 物流显示揽件但把快递弄丢了怎么办 在李宁商城上买的东西丢了怎么办 我的货发物流都过了好几天怎么办