- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序从网络接收数据包并将它们分派(dispatch)给一个或多个“处理器”。 (每个数据包都属于一个预定义的“流”,可以通过查看数据包数据来识别。)
目前有一个线程可以完成所有工作:
最佳答案
我已经完成了一些嵌入式编程,我不得不处理相对较高的吞吐量 - 不像你在这里那么快!希望您使用的硬件比我习惯的要强大得多……有一些简单的策略应该适用于您的情况!
1. 输入/处理队列和相关的内存管理很关键。
如果您的数据速率很高,则传入数据的队列必须非常高效。您应该进行尽可能少的处理,否则可能会丢失设备中的数据。 (我习惯于从某种具有相对较小缓冲区的快速串行设备读取数据,因此对于在不丢失数据的情况下可以保留设备多长时间没有实时限制。这让我养成了习惯处理从设备读取作为一个完全独立的任务,它只处理读取数据而不是别的。)
一系列非常简单的固定大小的预分配缓冲区与它获得的效率差不多:有一个“空闲”缓冲区队列和一个“填充”缓冲区队列。如果您使用无锁链表,维护这些链表会非常快,而且入队/出队操作在许多操作系统中都很常见。
避免使用 malloc 或其他动态分配,因为当它们需要管理自己的“空闲”和“分配”块的数据结构时,它们具有显着的(通常是不可预测的)开销。如果生产者或工作线程大约在同一时间释放或分配内存,它们也可能会执行可能会不可预测地阻塞生产者或工作线程的锁。相反,尝试找到较低级别的例程,用于分配和释放操作系统为队列提供的整个页面(unixy 平台上的 mmap,VirtualAllocEx)。这些通常需要做的工作要少得多,因为它们使用 MMU 功能来映射 RAM 的物理页面,并且在内存中没有复杂的数据结构需要维护,每次调用都有更可靠的运行时,并且速度可能很快如果它的数量不足,足以扩展您的免费列表。
在生产者中,不要担心小于整个块的单位。从队列中取出一个空闲块,将一个装满数据的块打包,加入到待处理的队列中。如果您必须确保在固定时间段内处理每个数据包,或者您需要处理“突发”数据速率,那么仍然尝试从您的输入设备读取一个完整的缓冲区,但要么将块的大小减小到是一个“合理”的时间量,或者使用超时并将部分填充的块排入队列以进行处理,并用某种空包“填充”剩余部分。我发现这样做通常比包含大量代码来处理部分填充的缓冲区要快。
如果可以,请非常仔细地设置生产者线程的处理器关联性和线程优先级。理想情况下,您希望生产者线程的优先级高于任何消费者线程,并绑定(bind)到特定的内核。没有什么可以防止传入数据在缓冲区空间不足的情况下被读取。
2.加工
你说过有:
关于c++ - 单个生产者和多个单线程消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057535/
此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。 struct foo { foo(int a) { s[0] = '0'+a%10;s[1]
我想要一个图表,其中有一个单线箭头,如下所示: 1 2 3 4 5 或者像这样(其中/假设是一个箭头:)): \/ -----------------
我正在为 Java 编写自定义规则。有两个 Tree.KIND 实例(STRING_LITERAL 和 ASSIGNMENT)需要捕获。有一个特定的行,字符串文字和赋值的逻辑都会引发问题。但 Sona
Rosettacode.org 在 Ruby 中有这个出色的单行 FizzBuzz 解决方案。 1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n
很多时候我使用了这个命令,它在当前目录打开了一个临时的 HTTP 服务器: python3 -m http.server 现在我需要接收文件,有没有打开ftp服务器的一行命令? 我只是在寻找一个命令行
相关主题 std::unique_ptr, deleters and the Win32 API 要将 Win32 句柄用作 RAII,我可以使用以下行 std::unique_ptr::type,
我认为必须有一个单行 Guava 解决方案来将一个不可变列表转换为另一个不可变列表,但我找不到它。假设我们有以下对象: ImmutableList input = ImmutableList.of("
我有以下 Highcharts ( http://www.highcharts.com ) 散点图。请注意,轴从 -10 开始,到 10 停止,中间为 0。我希望每条 0 线的宽度或颜色都与其他线不同
我有一个项目需要将一个视频文件与另一个音频文件合并。预期的输出是一个视频文件,其中包含来自实际视频的音频和合并后的音频文件。输出视频文件的长度将与实际视频文件的大小相同。 是否有单行 FFMPEG 命
我在 python3 类中有 2 个列表: self.keys = ["a","b","c","d"] self.values = [1,2,3,4] len(self.keys) == len(se
我有一个不同长度的数组列表,我想将它们组合成一个最大维度的矩阵,并在末尾填充零。例如(伪代码): combine( [1,2,3], [4,5]) [[1,2,3],[4,5,0]] 这是我目前的解决
例如,给定 i=5 和 n=8,我想生成 [0;0;0;0;1;0; 0;0]。具体来说,我想生成向量 v 以便: v = zeros(n,1); v(i) = 1; 有没有一种(合理的)方法可以在一
我是一名优秀的程序员,十分优秀!