Linux内核使用TCP和RB树的链表用于进程调度.
在算法效率方面,这些都是有道理的.您将一次收到一堆数据包,因此O(1)插入列表的末尾是不错的.
通过进程调度,“完全公平调度程序”使用红黑树,O(1)时间来选择任务.
据我所知,这些都不是以“平”的方式实现的 – 链表是一堆具有指向其他节点的节点,就像树一样.这就是说,据我所知,这些结构的地方应该是穷人.
从我所看到的缓存位置往往超过算法效率.
有没有关于Linux编程的数据集,这使得这些结构的算法效率超过其他人的缓存效率?
我误会了吗?有没有人分析?
解决方法
我有部分答复使用链接列表,相信您将在
this page about the CFS scheduler中找到一些有趣的信息,特别是它提到红黑树如何处理插件,搜索和删除等操作的最坏情况这实际上似乎是一个非常理想的调度器属性.
我会赌注,是的,内核已经看到相当多的分析,这些数据结构似乎在现实世界中表现良好.
This blog post有一些关于内核链表使用情况的很好的数据.通过保持每个操作的计数器,这些数据显然是在正常使用的3天内收集的.
+--------------------+-----------+ | Operation | Frequency | +--------------------+-----------+ | Empty Test | 45% | | Delete | 25% | | Add | 23% | | Iterate Start | 3.5% | | Iterate Next | 2.5% | | Replace | 0.76% | | Other Manipulation | 0.0072% | +--------------------+-----------+
正如您可以看到,实际访问元素的操作占总数的6%,而插入和删除加起来几乎一半.这是一个用例,其中链接列表开始变得更有意义.请注意,数据是在整个内核中收集的,而不是特定的TCP代码,因此链接列表的原理可能在每次使用时可能不一样,但总数据确实表明这些完全一致.
我认为,同样重要的是要记住,内核的设计必须能够从最小的嵌入式设备扩展到处理大量数据的超级计算机,此时算法效率可能开始严重超过缓存问题.