thttpd源码解析 定时器模块

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,记录信息

  

  

转载请注明作者:Focustc,博客地址为http://blog.csdn.net/caozhk,原文链接为点击打开

  

  

thttpd源码解析 定时器模块

时间: 2024-10-07 00:13:15

thttpd源码解析 定时器模块的相关文章

jQuery源码解析(架构与依赖模块)第一章 理解架构

1-1 jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器.jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用).events.实现动画效果,并且方便地为网站提供AJAX交互.jQuery还有一个比较大的优势是,它

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

thttpd源代码解析 定时器模块

thttpd源代码解析 定时器模块 thttpd是很轻量级的httpserver,可运行文件仅50kB.名称中的第一个t表示tiny, turbo, 或throttling 与lighttpd.memcached.redis相比很小巧,仅有不到8k行,而后三者大小分别为:60k,13k,86k 支持HTTP/1.1和CGI:採用IO复用实现,单线程,可移植:实现了基于URL的文件流量限制功能 特别适用于大量静态数据訪问的场景,如图片存储 2004年已经停止维护,有一个关于X-Forwarded-

Android xUtils3源码解析之图片模块

初始化 x.Ext.init(this); public static void init(Application app) { TaskControllerImpl.registerInstance(); if (Ext.app == null) { Ext.app = app; } } public final class TaskControllerImpl implements TaskController { public static void registerInstance()

Android xUtils3源码解析之数据库模块

xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3源码解析之图片模块 三. Android xUtils3源码解析之注解模块 四. Android xUtils3源码解析之数据库模块 配置数据库 DbManager.DaoConfig daoConfig = new DbManager.DaoConfig() .setDbName("test.db") .setDbVersion(1) .setDbOpenListe

Android xUtils3源码解析之注解模块

xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3源码解析之图片模块 三. Android xUtils3源码解析之注解模块 四. Android xUtils3源码解析之数据库模块 初始化 public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { su

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

erlang下lists模块sort(排序)方法源码解析(二)

上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel模块,因为我们先前主要分析的split_1_*对应的是rmergel,我们先从rmergel查看,如下 ....................................................... split_1(X, Y, [], R, Rs) -> rmergel([[Y, X

区块链教程btcpool矿池源码分析StratumServer模块解析

兄弟连区块链教程btcpool矿池源码分析StratumServer模块解析 核心机制总结 接收的job延迟超过60秒将丢弃 如果job中prevHash与本地job中prevHash不同,即为已产生新块,job中isClean状态将置为true????* true即要求矿机立即切换job 三种情况下将向矿机下发新job:???? 收到新高度的job???? 过去一个job为新高度且为空块job,且最新job为非空块job????* 达到预定的时间间隔30秒 最近一次下发job的时间将写入文件(