对BSD的新路由查找算法的理解

简介:
bsd的路由查找算法我研究过一段时间,当时我们要自己写一个路由查找模块,要扩展性好的,要紧凑的,耦合性低的,于是我就选择了bsd的radix算 法,它不同于linux的哈希表查找算法,linux内核实现了两种查找算法,一个是哈希表算法,一个是LC-trie算法,我感觉linux设计的东西 不是那么紧凑,但绝对是一件艺术品,比较适合有品味的人欣赏和使用,大多数人还是驯服不了它,唉,承认自己的品味低,只好选择radix算法了,这里我绝 对没有贬低它的意思,其实我自己比较欣赏radix的,呵呵。bsd强调的东西和linux不同,在统一性方面不管是windows还是bsd做的都要比 linux好。闲话不扯了。 
基于radix树的查找算法中,bsd将一个ip地址分为解成了一个二进制比特串(计算机中它本身就是比特串,我是从读内核的人的角度分析的),然后在一颗二叉radix树中进行查找匹配,树的节点是需要测试的比特位,比如一个树节点的数据是15,那么当这个ip二进制串到达这里时就要测试第15位,如果 15为1,则向右拐,如果为0则向左拐,直到叶子节点,如果这个条目和需要的匹配则就是它了,如果不匹配,则回溯,不断的检查回溯过程中的掩码链表,以期 求得一个更大范围的普适路由。就是这样了,但是我们来看看会出现什么问题。 
首先,整棵树是那么的紧凑以至于我们必须将它作为一个整体,linux就好得多了,内核中的路由表以fib_table为顶向下分为了好多层,比如 fn_zone,fib_node,fib_alias,fib_info,fib_nh,这么几层下来每层都是独立的,可灵活维护的,这看起来非常灵活,不需要整个路由表的全局锁,只有在写操作时有一个fib_hash_lock,只要分开的东西就可能被并行计算看到,因此这样会比较好,所有 linux的优点恰恰是bsd的缺点,要访问路由表时要全局加锁,一下子锁住全树,就像linux以前访问文件页高速缓存全局锁一样,这样在现代的多处理器环境下非常不利,于是它变化了。 
新的bsd路由查找算法也是分层的,但是它的分层比linux更前进了一步,它不但将算法分层,还将ip地址分层,其实叫分级,把一个ip地址分为相等的 4份,每份8位,每8位每8位的进行匹配,这样只需要锁柱正在计算的8位就可以了,实际上,它将计算给分解了,这非常类似于虚拟地址到物理地址转化时的机 制,页目录负责高10位,页表负责中10位等等,而且恰恰巧的是,它就是这么实现的,本质上,它并没有改变原先的radix的实质,只不过将比较位数扩展 为了8位,以前的比较中,只比较1位非1即0,走形方向非左即右,现在比较8位,就不是非左即右了,而是成了n叉树,具体走哪一叉和原来一样,要看前一级的比较结果,这个算法实际上如果写得好的话,可以在原来的radix基础上扩充,我觉得这个新实现和linux内核的页高速缓存的radix树一样。 

经过这盘更改后效率当然提高了很多,每一级的计算要有8位参与,这个计算量恰好适合现代处理器的超标量以及超线程及多核进行并行处理,速度加快,而且一次 算8位,总的计算次数只有4次,不像以前的32次,每次1位还不够处理器塞牙缝呢,浪费了大量处理器,另外不再需要全局锁了,因为计算就不是全局的。更重 要的是,以前的一次比较1位根本无法利用cpu缓存,比较意味着处理器分支预测,你让处理器那么多次的猜你的心,它会疯的,而现在一次读入8个位,数据都 在缓存里面,随便用,当然比较还是也有分支预测失败,但是数据都在缓存,可以不必理会存储器,而以前的一次1位你根本不知道下面该取什么数据了,现在存储 器的带宽那么高全浪费了,就算你不让他浪费,结果该往左拐的预先取到右节点的数据,全错了,刷新缓存浪费更厉害。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274168

相关文章
|
监控 网络协议 Ubuntu
Linux网络监控工具 - iftop
Linux网络监控工具 - iftop
614 1
|
8月前
|
存储 新零售 安全
阿里云盘企业版收费标准、功能支持、存储配置及用户数全解析
阿里云盘企业版提供高性价比存储方案,500GB仅需169元/年,支持协同办公、权限管理、智能文件管理、多重安全防护及卓越性能,适用于多行业企业高效办公。
1314 0
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
768 23
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
874 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
前端开发 Unix Linux
KVM 架构概述
【10月更文挑战第12天】KVM是基于硬件辅助虚拟化技术的虚拟机监控器,核心依赖于CPU的虚拟化支持如Intel VT和AMD-V。
|
搜索推荐 SEO
什么是已备案域名?已备案域名有什么作用?
【10月更文挑战第10天】什么是已备案域名?已备案域名有什么作用?
1620 2
|
Rust 安全 Cloud Native
带你读《2022龙蜥社区全景白皮书》——5.6.2 云原生场景下的计算核心RunD
带你读《2022龙蜥社区全景白皮书》——5.6.2 云原生场景下的计算核心RunD
857 104
|
存储 Prometheus 监控
Linux技术工具:bpftrace介绍
Linux技术工具:bpftrace介绍
787 7
|
Linux 测试技术 调度
Linux调度器何时需触发抢占?—— 从hackbench谈起
作者:何惟禹 吴一昊一、背景:性能之战“不服跑个分”虽然已经沦为手机行业的调侃用语,但在操作系统领域仍然是最重要的评价方式之一。本文的故事也源于一次 Alinux3 与 CentOS8 的一次跑分的较量。当然比分较量并不是目的,更重要的是发现存在的回归缺陷并进行修复,最终让 Alinux3 全方位持平或超过 CentOS8。在本次较量中,我们使用 hackbench 作为跑分软件,我们在测试过程中
3256 0
Linux调度器何时需触发抢占?—— 从hackbench谈起