Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

多线程

引言

这是一次尝试,旨在列出让 Wireshark 可以多线程化所涉及的所有任务。也就是说,可以同时打开多个捕获(文件),并利用多个处理器。

这样,如果我们以后想要做这件事,就知道将会面对什么。

  • 多线程

  • 引言

  • 任务

  • 核心

  • 去除全局变量

  • API

  • Dissectors

  • 去除全局变量

  • 修改分配器

  • 修改关联数组

任务

核心

去除全局变量

API

Dissectors

去除全局变量

  • 那些初始化一次且从不改变的变量,例如 hf_* 和 ett_*,是可以的
  • “现在是全局的”对象应添加到一个数据结构中,在会话开始时初始化,之后每次调用 dissector 时,与其他会话信息一起传递给 dissector。(这很可能只是一个非常小的问题)。

修改分配器

  • 所有 g_malloc 调用最终都应替换为 ep、se 或 pe 分配器。
  • se 和 pe 分配器不需要更改签名,但 {se|pe}_alloc() 需要在内部用锁保护,以使这些调用串行化/可重入。
  • 对于 ep 分配器,我们需要为每个线程准备一个数据池,以及一种廉价的方式来执行 “get_ep_pool_for_this_thread()”。这可以通过在线程创建的同时创建新的 ep 池,并在线程终止时释放整个池来完成。由于每个线程都有自己的池用于分配,因此我们既不需要给 ep 分配器添加任何锁,也不需要更改调用签名。

修改关联数组

  • 所有 HashTables 最终都应替换为 ep/se trees。

  • tree insert/lookup 调用需要由 “writer readers lock” 保护。这很可能可以通过单个全局锁完成,因为我们的使用模式主要是查找,插入很少。这应当可以在不更改这些调用签名的情况下实现。(尝试搜索 free-lock structure,以避免添加锁)

Imported from https://wiki.wireshark.org/Development/multithreading on 2020-08-11 23:12:55 UTC

相关 Wireshark Wiki 页面

网络分析技术档案