zoukankan      html  css  js  c++  java
  • 线程、槽和模块之间的关系[转]

    线程、槽和模块之间的关系

     
    suricata中tv、slot和tm的关系必须要搞清楚,汇总如下:
    tv:ThreadVars类型,线程。
    slot:TmSlot类型,槽。
    tm:TmModule类型,模块。
     
    下面必须要结合三者的定义,阅读代码的时候也关注下三者关系。
    ----------------------------------------
    线程的定义:
    typedef struct ThreadVars_ {
        pthread_t t;                      // 线程id
        char *name;                       // 线程name
        char *thread_group_name;          // 线程group name
        SC_ATOMIC_DECLARE(unsigned short, flags); // 原子声明,不知道作用,暂且不管
        uint8_t aof;                      // 线程遇到故障时怎么做
        uint8_t type;                     // 线程类型,例如:TVT_PPT, TVT_MGMT
        uint8_t restarted;                // 线程重新启动失败的次数
        Tmq *inq;
        Tmq *outq;
        void *outctx;
        char *outqh_name
        struct Packet_ * (*tmqh_in)(struct ThreadVars_ *);
        void (*InShutdownHandler)(struct ThreadVars_ *);
        void (*tmqh_out)(struct ThreadVars_ *, struct Packet_ *);
        void *(*tm_func)(void *);
        struct TmSlot_ *tm_slots;
        uint8_t thread_setup_flags;
        uint16_t cpu_affinity;
        int thread_priority;                // 线程优先级
        SCPerfContext sc_perf_pctx;
        SCPerfCounterArray *sc_perf_pca;
        SCMutex *m;
        SCCondT *cond;
     
        uint8_t cap_flags;
        struct ThreadVars_ *next;
        struct ThreadVars_ *prev;
    } ThreadVars;
    -----------------------------------------
    槽slot的定义:
    typedef struct TmSlot_ {
     
        ThreadVars *tv;                       // 拥有该slot的线程
        SC_ATOMIC_DECLARE(TmSlotFunc, SlotFunc);// 函数指针
        TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *);      // 模块数据包获取函数
        TmEcode (*SlotThreadInit)(ThreadVars *, void *, void **); // 模块初始化执行函数
        void (*SlotThreadExitPrintStats)(ThreadVars *, void *);   // 模块退出打印函数
        TmEcode (*SlotThreadDeinit)(ThreadVars *, void *);        // 模块清理执行函数
        void *slot_initdata;  // 数据存储
        SC_ATOMIC_DECLARE(void *, slot_data);
        PacketQueue slot_pre_pq;
        PacketQueue slot_post_pq;
        int tm_id;  // tm ID
        int id;     // slot ID
        struct TmSlot_ *slot_next;
    } TmSlot;
    -------------------------------------------------
    模块定义:
    typedef struct TmModule_ {
        char *name;          // 模块名称
        TmEcode (*ThreadInit)(ThreadVars *, void *, void **);
        void (*ThreadExitPrintStats)(ThreadVars *, void *);
        TmEcode (*ThreadDeinit)(ThreadVars *, void *);
        TmEcode (*Func)(ThreadVars *, Packet *, void *, PacketQueue *, PacketQueue *);
        TmEcode (*PktAcqLoop)(ThreadVars *, void *, void *);
        TmEcode (*Init)(void);
        TmEcode (*DeInit)(void);
        void (*RegisterTests)(void);
        uint8_t cap_flags;  
        uint8_t flags;
    } TmModule;
    ===============================================
    将三者的定义放在一起目的是方便查看,其中部分变量目前还不清楚具体含义,日后补充。
    三者之间关系如下图所示:


    虽然上图画的比较山寨,但应该可以清楚的说明三者之间的关系了,每一个线程都包含一个slot的链表,每个slot结点都悬挂着不同的模块,程序执行的时候会遍历slot链表,按照加入链表的顺序执行模块。
  • 相关阅读:
    使用jmeter进行接口测试
    jenkins默认插件
    【机器学习】关于PCA 昕
    雲瑞文件直链分享软件
    FOB离岸价
    【数据分享】某地区1959~2019年60年降雨量时间序列数据
    【数据分享】银行客户流失Bank Customer Churn数据
    【数据分享】糖尿病患者研究数据集
    【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
    C# Speech
  • 原文地址:https://www.cnblogs.com/the-tops/p/7592851.html
Copyright © 2011-2022 走看看