高级OS(二) - 从机制与策略分离分析内核双链表的设计与实现
一.引言-机制与策略分离的现状
机制(mechanism),即需要提供什么样的功能;策略(policy),即怎么样实现这些功能。操作系统是处于硬件和应用程序之间的一个中间层,由此可知,操作系统同时承担了两个角色,一个角色是对硬件资源的管理者,另一个角色则是对应用程序的服务者。对于操作系统和硬件的关系,硬件提供了许多功能,也就是提供了机制,而操作系统屏蔽掉了硬件的细节,给予了具体的实现,也就是提供了策略;对于操作系统和应用程序的关系,操作系统提供了许多功能,也就是提供了机制,而应用程序屏蔽了操作系统的细节,给予了具体的实现,也就是提供了策略。这就是机制与策略分离的思想。此思想不应该局限于分层的概念中,即使同一层次的编程问题,也是可以使用机制与策略分离的思想。现在使用的机制与策略分离思想的方法有将应用按照一个库来编写,还可以将应用程序分为协作的前端和后端进程。具体来说,就如内核list.h中提供了很多双向链表的方法,我们可以进行创建、删除链表等操作。
二.双向链表机制的设计思想分析(分析可以画图)
双向链表,从名字上理解就是双向的,指的是各结点之间的逻辑关系是双向的,可向前或向后查找。双向链表可以在一个结点的前边和后边添加一个新的节点。双向链表可以实现自我删除,删除结点时只需遍历链表找到要删除的结点,将该结点从表中摘除即可。双向链表通过遍历找到存储该数据元素的结点,直接更改其数据域即可。双向链表虽然消耗的内存更多,但是它的性能更好。
双向链表各结点包含以下三部分:
1.指针域(prior):用于指向当前结点的直接前驱结点;
2.数据域:用于存储数据元素;
3.指针域(next):用于指向当前结点的直接后继结点。
图1.双向链表结构示意图
(1)C语言中,一个基本的双向链表定义:
struct my_list{
void *mydata;
struct my_list *next;
struct my_list *prev;
}
(2)Linux内核对双向链表的定义:
struct list_he