在看内核模块机制的时候,居然看到了一个基于链表的线性查找,
我觉得有点奇怪,因为这种查找效率是O(N),后来想了一下也觉得合情合
理,并不是所有的查找场合都需要那些效率很高的查找方法,比如说基于
计算的哈希查找,基于红黑树时间复杂度为O(log(n))的查找,有些查找
在系统中用的不是很多,或节点的个数不是很多,那就没有必要用高效的
查找,免得增加系统的复杂度。
-----------------------------------------------------------------------------------------
一,内核中应用链表查询的场景。
1,了解点内核知识的都知道内核的模块机制,系统在启动的过程中
插入了一些模块,每个模块都有一个结构体作为该模块的描述符。在include/linux/module.h中就定义了该结构体struct module {};内核使用
链表将这些struct module组织起来。
-
244 struct module
-
245 {
-
246 enum module_state state;
-
247
-
248 /* Member of list of modules */
-
249 struct list_head list;//链接各模块的链表字段
-
250
-
251 /* Unique handle for this module */
-
252 char name[MODULE_NAME_LEN];
-
...
-
}
----------------------------------------------------------------------------------------------
二,内核中是如何进行链表的查找的?
-
373 /* Search for module by name: must hold module_mutex. */
-
374 struct module *find_module(const char *name)
-
375 {
-
376 struct module *mod;
-
377
-
378 list_for_each_entry(mod, &modules, list) {//遍历链表
-
379 if (strcmp(mod->name, name) == 0)//如果名字匹配成功则返回该结构体指针
-
380 return mod;
-
381 }
-
382 return NULL; //否则返回NULL
-
383 }
-
384 EXPORT_SYMBOL_GPL(find_module);
该查找的思想很简单,我觉得有点意思的是代码很精简,
主要是内核里面的链表封装的好吧。
---------------------------------------------------------------------------------------------
三,用户态模仿。
-
struct stu *find_stu(struct list_head *head,char *name)
-
{
-
struct stu *s;
-
list_for_each_entry(s,head,list) {
-
if (strcmp(s->name,name) == 0)
-
return s;
-
}
-
return NULL;
-
}
如上是建立一个简单的查找模型,N个学生,由链表组织,现在要在
链表中查找某个学生。
--------------------------------------------------------------------------------------------
四,查找模型完整代码。
list_search.rar
---------------------------------------------------------------------------------------------
阅读(1753) | 评论(0) | 转发(0) |