计算数据包与计算数据包中的字节总数之间的区别

时间:2019-05-18 02:32:59

标签: multithreading

我正在读perfbook。在第5.2章中,该书提供了一些有关统计计数器的示例。这些示例可以解决网络数据包计数问题。

  

快速测验5.2:网络数据包计数问题。假设您需要   收集有关网络数据包数量(或总数)的统计信息   发送和/或接收的字节数)。数据包可能是   由系统上的任何CPU传输或接收。进一步假设   这台大型机器每台能够处理一百万个数据包   其次,还有一个系统监视包可以读取   每五秒钟计数一次。您将如何实施此统计数据   柜台吗?

有一个QuickQuiz询问计数包和计数包中字节总数之间的区别。

我不明白答案。看完之后,我仍然不知道有什么区别。

“见此”段落中的示例,如果将数字3和5更改为1,会有什么不同?

请帮助我理解它。

  

QuickQuiz5.26 :计数之间有什么基本区别   数据包并计算数据包中的字节总数,给定   数据包大小不一?

     

答案:计算数据包时,   计数器仅增加一。另一方面,当   计数字节时,计数器可能会以较大的数字递增。

     

为什么这很重要?因为在以1为增量的情况下,该值   在一定程度上,必须返回计数器   在某个时间点已经采用了该值,即使它是   无法确切地说出这一点何时发生。相反,   在计数字节时,两个不同的线程可能返回的值是   与所有全局操作顺序不一致。

     

要看到这个,   假设线程0将值三添加到其计数器线程1   将值5加到其计数器中,线程2和3求和   柜台。如果系统是“弱有序”的,或者编译器使用   积极的优化,线程2可能会发现总和为3,   线程3可能会找到五个总数。唯一可能的全球订单   计数器的值序列的0,3,8和0,5,8,以及   两种顺序均与获得的结果不一致。

     

如果您错过了   这个,你并不孤单。迈克尔·斯科特(Michael Scott)提出了这个问题   Paul博士期间的Paul E. McKenney防御。

1 个答案:

答案 0 :(得分:0)

我可能是错的,但假定其背后的想法如下:假设有2个独立的过程收集其计数器的总和。现在假设在两个过程中同时发生一些事件序列,例如,大小为10的数据包同时进入第一个过程,大小为20的数据包同时出现在第二个过程中,并且在一段时间之后当大小为60的数据包进入第二个进程时,大小为30的分组同时进入第一进程。这是事件的顺序:

           Time point#1  Time point#2
Process1:  10            30
Process2:  20            60

现在,考虑到先前的总值为0,现在让我们为弱序系统在#1和#2时间点之后建立可能的总计数器状态的向量:

Time point#1
0 + 10 (process 1 wins) = 10
0 + 20 (process 2 wins) = 20
0 + 10 + 20 = 30

Time point#2
10 + 30 = 40 (process 1 wins)
10 + 60 = 70 (process 2 wins)
20 + 30 = 50 (process 1 wins)
20 + 60 = 80 (process 2 wins)
30 + 30 = 60 (process 1 wins)
30 + 60 = 90 (process 2 wins)
30 + 90 = 110

现在假设time point#1time point#2之间可能存在一段时间,让我们评估哪些值反映了系统的真实状态。显然,time point#1之后的所有状态都可以视为有效,因为在某个确切的时刻,接收到的总大小为10、20或30(我们忽略了最终值可能不是实际值-至少它是事实)包含系统正常运行时的实际值)。对于Time point#2之后的可能状态,图片略有不同。例如,系统从未处于40、70、50和80状态,但是我们有在第二次收集后获得这些值的风险。

现在让我们从数据包数量的角度来看情况。我们的事件矩阵是:

           Time point#1  Time point#2
Process1:  1             1
Process2:  1             1

可能的总状态:

Time point#1
0 + 1 (process 1 wins) = 1
0 + 1 (process 1 wins) = 1
0 + 1 + 1 = 2

Time point#2
1 + 1 (process 1 wins) = 2
1 + 1 (process 2 wins) = 2
2 + 1 (process 1 wins) = 3    
2 + 1 (process 2 wins) = 3
2 + 2 = 4

在这种情况下,所有可能的值(1、2、3、4)都反映出系统肯定处于某个时间点的状态。