Linux 2.6内核链表数据结构学习4

10 hlist扩展精益求精的Linux链表设计者(因为list.h没有署名,所以很可能就是Linus Torvalds)认为双头(next、prev)的双链表对于HASH表来说"过于浪费",因而另行设计了一套用于HASH表应用的hlist数据结构--单指针表头双循环链表,从上图可以看出,hlist的表头仅有一个指向首节点的指针,而没有指向尾节点的指针,这样在可能是海量的HASH表中存储的表头就能减少一半的空间消耗。struct hlist_head{    struct hlist_node *first;};struct hlist_node {    struct hlist_no...
默认分类 | 2011-04-28 10:20 | 阅读 714 次 | 评论 0 条

Linux 2.6内核链表数据结构学习3

8 遍历遍历是链表最经常的操作之一,为了方便核心应用遍历链表,Linux链表将遍历操作抽象成几个宏。在介绍遍历宏之前,我们先看看如何从链表中访问到我们真正需要的数据项。struct list_head *i;list_for_each(i, &(nf_sockopts.list)){ struct nf_sockopts *ops = list_entry(i, struct nf_sockopts, list);} 函数首先定义一个(struct list_head *)指针变量i,然后调用list_for_each(i,&(sockopt.list))进行遍...
linux | 2011-04-28 10:13 | 阅读 763 次 | 评论 0 条

Linux 2.6内核链表数据结构学习2

4 插入对链表的插入操作有两种:在表头插入和在表尾插入。Linux为此提供了两个接口:static inline void list_add(struct list_head *new, struct list_head *head);static inline void list_add_tail(struct list_head *new, struct list_head *head);因为Linux链表是循环表,且表头的next、prev分别指向链表中的第一个和最末一个节点,所以,list_add和list_add_tail的区别并不大,实际上,Linux分别用__list_ad...
linux | 2011-04-27 12:00 | 阅读 828 次 | 评论 0 条

Linux 2.6内核链表数据结构学习1

Linux 2.6内核链表数据结构1 链表设计原理这里使用2.6内核,但实际上2.4内核中的链表结构和2.6并没有什么区别。不同之处在于2.6扩充了两种链表数据结构:链表的读拷贝更新(rcu)和HASH链表(hlist)。这两种扩展都是基于最基本的list结构,因此,本文主要介绍基本链表结构,然后再简要介绍一下rcu和hlist。链表数据结构的定义很简单(节选自[include/linux/list.h],以下所有代码,除非加以说明,其余均取自该文件):struct list_head { struct list_head *next, *prev;}; list_head结构包含...
linux | 2011-04-26 14:44 | 阅读 763 次 | 评论 0 条
文章分类
文章归档
最新评论