Chinaunix首页 | 论坛 | 博客
  • 博客访问: 913469
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-08-14 18:24:19

       在看内核模块机制的时候,居然看到了一个基于链表的线性查找,
我觉得有点奇怪,因为这种查找效率是O(N),后来想了一下也觉得合情合
理,并不是所有的查找场合都需要那些效率很高的查找方法,比如说基于
计算的哈希查找,基于红黑树时间复杂度为O(log(n))的查找,有些查找
在系统中用的不是很多,或节点的个数不是很多,那就没有必要用高效的
查找,免得增加系统的复杂度。
-----------------------------------------------------------------------------------------
一,内核中应用链表查询的场景。
      1,了解点内核知识的都知道内核的模块机制,系统在启动的过程中
插入了一些模块,每个模块都有一个结构体作为该模块的描述符。在include/linux/module.h中就定义了该结构体struct module {};内核使用
链表将这些struct module组织起来。

  1. 244 struct module
  2. 245 {
  3. 246 enum module_state state;
  4. 247
  5. 248 /* Member of list of modules */
  6. 249 struct list_head list;//链接各模块的链表字段
  7. 250
  8. 251 /* Unique handle for this module */
  9. 252 char name[MODULE_NAME_LEN];
  10.     ...
  11.     }

----------------------------------------------------------------------------------------------
二,内核中是如何进行链表的查找的?

  1. 373 /* Search for module by name: must hold module_mutex. */
  2.  374 struct module *find_module(const char *name)
  3.  375 {
  4.  376 struct module *mod;
  5.  377
  6.  378 list_for_each_entry(mod, &modules, list) {//遍历链表
  7.  379 if (strcmp(mod->name, name) == 0)//如果名字匹配成功则返回该结构体指针
  8.  380 return mod;
  9.  381 }
  10.  382 return NULL; //否则返回NULL
  11.  383 }
  12.  384 EXPORT_SYMBOL_GPL(find_module);
该查找的思想很简单,我觉得有点意思的是代码很精简,
主要是内核里面的链表封装的好吧。
---------------------------------------------------------------------------------------------
三,用户态模仿。

  1. struct stu *find_stu(struct list_head *head,char *name)
  2. {
  3.     struct stu *s;
  4.     list_for_each_entry(s,head,list) {
  5.         if (strcmp(s->name,name) == 0)
  6.                 return s;
  7.     }
  8.     return NULL;
  9. }
如上是建立一个简单的查找模型,N个学生,由链表组织,现在要在
链表中查找某个学生。
--------------------------------------------------------------------------------------------
四,查找模型完整代码。
 list_search.rar  

---------------------------------------------------------------------------------------------


                                
阅读(1753) | 评论(0) | 转发(0) |
0

上一篇:不同人眼中的我

下一篇:内核模块的编译

给主人留下些什么吧!~~