Open vSwitch系列之数据结构解析深入分析Hmap

作为Open vSwitch系列的第一篇文章,选择分析哪个数据结构我思考很久,最后还是选择比较常见而且很基础的结构hmap。
在Open vSwitch世界中很多地方都是由hmap组织、关联起来的,因此我们将这部分分析透彻是很有必要的,而且这部分功能相对独立,也可以做日后一个技术积累,最后会有一个demo提供给大家。

1、初始化hmap的函数

以全局变量static struct hmap raw_instance_map为例进行讲解,经过上面函数处理之后,就会形成下面数据结构图:

右侧的0xbfffee98,0xbfffee9c,代表内存块的地址,左侧的buckets,one,mask,n代表内存名称。 由内存结构中可知,one=null,buckets存储的是one的地址。
2、插入函数


通过函数hmap_insert_fast,插入一个节点。

1)struct hmap_node **bucket = &hmap->buckets[hash & hmap->mask]; 获取数组存储单元的地址。由于此时mask=0,因此此处临时变量bucket的值是one的地址,即0xbfffee9c。

2)临时变量bucket进行*操作后,取值为0,即为NULL。

3)代码*bucket = node; 则将one置为0xbffff03c。

注:当mask=0时,临时变buckets保存的始终是成员变量one的地址。

当插入两条记录的时候,在链表头部进行插入并且修改one指向。在函数hmap_insert_at中执行完插入操作,又以一个判断,是否需要调整hmap的哈希桶的大小,如下:

当插入完第二条数据之后,开始进行调整,即函数hmap_expand_at。

1)计算新的new_mask值。
2)调用函数resize进行调整。

此函数主体思想是:
首先,申请一个临时变量,并创建new_mask+1个大小的数组(用于存储struct hmap_node *)。
其次,然后现有的hmap中的节点链表一个一个的移动到临时tmp,并且以new_mask做映射。
再次,将现有hmap与临时hmap进行替换,并且释放临时hmap。

最后内存存储结构如下图所示:

注意:这个地方需要注意下,这个两行代码,

以上就是hmap核心内容,当然hmap中还有很多内容,但是都是辅助内容,这里不再介绍。具体介绍opevswitch数据结构可参考这篇文章OpenvSwitch数据结构解析。具体demo下载

作者简介:
徐小冰:毕业于河北大学,主要从事嵌入式软件开发,虚拟化,SDN。目前基于ODL和Open vSwitch进行二次开发,希望与广大网友一起探讨学习。作者系OpenDaylihgt群(194240432)资深活跃用户,@IT难人。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/15552.html
分享到:
相关文章
条评论

登录后才可以评论

xxb249 发表于16-01-07
0