thttpd源代码解析 定时器模块

  • thttpd是很轻量级的httpserver,可运行文件仅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源代码解析 定时器模块的更多相关文章

  1. Cocos2d-x源代码解析(1)——地图模块(3)

    接上一章<Cocos2d-x源代码解析(1)--地图模块(2)> 通过前面两章的分析,我们能够知道cocos将tmx的信息结构化到 CCTMXMapInfo.CCTMXTilesetInf ...

  2. Android xUtils3源代码解析之网络模块

    本文已授权微信公众号<非著名程序猿>原创首发,转载请务必注明出处. xUtils3源代码解析系列 一. Android xUtils3源代码解析之网络模块 二. Android xUtil ...

  3. 《nginx源代码解析》系列分享专栏

    <nginx源代码解析>系列分享专栏 解析nginx源代码,从main函数开始,一步步解读nginx运行原理,同时进行nginx第三方模块的开发,努力做到知其然,知其所以然 <ngi ...

  4. linux device tree源代码解析--转

    //Based on Linux v3.14 source code Linux设备树机制(Device Tree) 一.描述 ARM Device Tree起源于OpenFirmware (OF), ...

  5. Android源代码解析之(十三)--&gt;apk安装流程

    转载请标明出处:一片枫叶的专栏 上一篇文章中给大家分析了一下android系统启动之后调用PackageManagerService服务并解析系统特定文件夹.解析apk文件并安装的过程,这个安装过程实 ...

  6. Spark技术内幕:Client,Master和Worker 通信源代码解析

    Spark的Cluster Manager能够有几种部署模式: Standlone Mesos YARN EC2 Local 在向集群提交计算任务后,系统的运算模型就是Driver Program定义 ...

  7. Spring源代码解析

    Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.itey ...

  8. python解析xml模块封装代码

    在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...

  9. Arrays.sort源代码解析

    Java Arrays.sort源代码解析 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类 ...

随机推荐

  1. 都系坤坤-微信助手V 0.1,解放双手发信息

    端午节刚过,相信大家在端午节都收到不少微信祝福信息,有复制长篇大论的祝福语群发的,有人工手打的简单祝福群发,我更喜欢人工手打带上称呼的祝福信息,这样看起来更加亲切. 那么问题来了,当你的通讯录里好友多 ...

  2. Jvm运行时数据区 —— Java虚拟机结构小记

    关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...

  3. Springboot 版本+ jdk 版本 + Maven 版本的匹配

    Spring boot 版本 Spring Framework jdk 版本 maven 版本 1.2.0 版本之前 6 3.0 1.2.0 4.1.3+ 6 3.2+ 1.2.1 4.1.3+ 7 ...

  4. xsy 1836 - Shop

    from NOIP2016模拟题36 Description 商店里有n种背包和m种物品,物品体积为1到m,背包容积<=m 给出n个背包的容积 现在要求出这样一个物品集合,满足: 1)对于任意一 ...

  5. 【CF1029A】Many Equal Substrings(模拟)

    题意:给定一个长度为n的串s,要求构造一个长度最小的使s出现了k次的串,可以重叠 n<=50,k<=50 思路:计算一下前后缀相同长度 #include<cstdio> #in ...

  6. 【CF1017A】The Rank(签到)

    题意:给定n个人的4门课成绩,排名按总分,保证总分互不相同,求1号名次 n<=1e3,a[i],b[i],c[i],d[i]<=1e2 思路: #include<cstdio> ...

  7. es6总结(七)--proxy & reflect

  8. 解决 unresolved external symbol 无法解析 _send@16(转)

    (1) vc网络编程中遇到一个编译问题,原来是少了WSOCK32.LIB. 在 project-->settings-->Link-->Object/Library modules ...

  9. Django ConnectionAbortedError WinError 10053 错误

    因为ajax默认是异步提交,可是有时候我们会发现,本来要求请求马上出现,可是异步会导致后面突然再执行,这样就出问题了. (1)添加这样一段代码 $.ajaxSetup({ async : false ...

  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---0

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...