OISF engine prototype: threading

2009/02/28

当我创造这些代码的时候考虑的第一件事就是线程。当前代码可以以单一线程或者多线程方式运行。我在平时测试的时候,运行大约11个线程,其中10个处理包,剩下1个是管理线程。

关于线程,最基本的原则是一个包同时只被最多一个线程处理。因为这样可以避免许多锁问题。这样,当存在一个以上的线程时,引擎可以同时处理多个包。

所有的功能都在(我称之为)线程模块中产生。这样一个模块运行在一个线程中。线程可以拥有一个或更多个运行的模块。例如,有解码模块、检查模块、警报模块等。我打算在将来实现这些模块插件化,以便在不重新编译代码库的情况下加载第三方模块。

这个线程模型以并行和串行的方式工作。并行可以用于多个线程做一件工作,例如,有两个线程都用于获取包,解码,检查,警报。线程的串行方式则有些不同。比如有这样一种情景,1个线程任务有限(比如只负责解码),当它出力完一个包后将这个包传给下一个线程(比如这个线程只负责检查)。两种方法可以结合,我默认情况下使用1个包获取线程,2个解码线程,2个检查线程,1个判断线程,以及一些警报和实时响应线程。

在串行的各个线程中,使用了队列(queue)这种结构,用于包从一个线程传送给另一个。一个队列可以包含许多个包。在上面那个例子中,nfq包获取线程可以从队列中尽可能快的读入包,并在处理完之后将它们放入自己的队列中。之后,2个解码线程又从这个nfq包获取线程的队列中尽可能快的获取包。处理完之后又把这些包放入下一个队列,以便后面的进程从中获取包。如此往复。

还可以使用队列的代码路径来确定。例如,可以使用不同的线程处理IPv4包,而不是IPv6包。或者使用不同的线程处理有警报的数据包,而不是没有警报的数据包。

目前的主要挑战是配置过于复杂,对于有能力的使用者这可能引起他们的兴趣,但对于正常用户来说这些复杂的配置可能会困扰他们。(对于最新版的suricata,配置功能已经很强大且简单了)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 7,823评论 1 17
  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 10,327评论 0 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,551评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,258评论 19 139
  • 这两天有些懒散,大概是高强度下工作的后遗症症吧!没有强迫自己干什么,搜集资料准备写稿!已过三分之一。晚上指导完毕犯...
    sanyaojing阅读 1,193评论 0 0

友情链接更多精彩内容