双链表
1. 机制与策略分离的现状
机制与策略分离是在对具体场景来说的,比如操作系统对于硬件来说,提供了具体实现方法(策略);对于应用程序来说,提供了功能(机制)。
(1) 编写应用程序时按照库的方式进行,其中包含了很多C程序,而控制流程则使用脚本编写。
(2) 应用程序的编写实现机制与策略分离,前端实现策略,后端实现机制,这样的设计方法可以较低复杂度。
2. 双向链表的设计思想分析
3. 对list_add函数进行拆解,并在在用户态下应用
对此插入函数进行拆解,其调用了一个函数,再进入__list_add中查看,
发现除了普通的插入时所需指针关系调整之外,还有一个WRITE_ONCE函数,再进入此函数查看,此函数不在list.h中,在compiler.h中,
这个宏定义了一个联合体,直接将要赋值的值读进来,再使用了__write_once_size函数,再进入此函数查看,
这个函数中,赋值变量的指针变成了指向volatile变量的指针,volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错。那么也就是说WRITE_ONCE宏主要用于向变量对应的内存写入值。如此再回到__list_add函数中,那么是实现了把new对应的内存写入pre->next中。
如下是在用户态下写了myDoubleList.h文件:
4. 双向链表的应用(学生信息的存储和遍历)
调试结果:
5. 启发
内核模块中的函数设计得很巧妙,他把指针和存储数据区分开来,增删查改都是如此,不只是简单的存储修改,还有一些对变量的约束和优化,往后对linux内核源码还要多多研究和体会。