Kernel Data Structures
Kernel 提供了以下的数据结构,就不要造轮子了(don't reinvent the wheel.)。Linked lists、Queues、Maps、Binary trees
Linked lists
链式结构的数据是在不同的时期创建的,他们可能存放在并不连续的内存空间中,为此需要需要把他们linked together。有单链结构、双链结构。有环形链式结构(又可细分为环形单链、环形双链)。Linux最常使用的就是环形双链结构circular doubly linked list. (图6.4)
在Linked list中第一个元素经常被称为head,最后一个元素的指针执行NULL。
Linked list内核安置实现的方式如下:
struct list_head{
struct list_head *next
struct list_head *prev;
};
struct fox {
unsigned long tail_length;
unsigned long weight;
bool is_fantastic;
struct list_head list; /*list of all fox structures*/
};
接下来就是所谓的增删查对linked list操作。不过即使进行了前面的基本操作,还是不能获取这个linked list里面元素的具体数据是多少。Kernel利用C语言指针的功能,给出了相应的查看修改内部element的方法。
Queues
简单来说就是FIFO,如下图:
这个比较简单,就是比较enqueue和dequeue的大小,通知需要知道整个FIFO的长度(也就是所谓的深度Size of queue)。接下来也就是基本的增删改查,摧毁,新建的操作。
Maps
A map, also known as an associative array, is a collection of unique keys, where each key is
associated with a specific value.The relationship between a key and its value is called a
mapping.
简单来说就是一个映射,甚至和hash table有关系。这个概念比较难理解。简单解释如下:
var numbers = [1, 2, 3, 4];
var timesTwo = function(n) {
return n * 2;
}
numbers.map(timesTwo); // [2, 4, 6, 8]
. In the most general sense, "mapping" in programming means taking several things and then somehow associating each of them with another thing. 类似于一个对应 映射函数关系。
其中一个主要用途就是map 一个unique identification number(UID)、idr之类的。然后就是新一轮的增删改查。
Binary trees
A tree is a data structure that provides a hierarchical tree-like structure of data. Mathemati-
cally, it is an acyclic, connected, directed graph in which each vertex (called a node) has zero or more outgoing edges and zero or one incoming edges.
其中有BST树,这样的排序是搜索非常高效、方便。主要特征如下:
左边的nodes比树根的值小;
右边的nodes比树根的值大;
每一个子树根也满足1.2的规则。(如下图)
self-balance BST就是首先满足BST的规则,然后树叶的深度的最深差别不超过1。如下图:
Linux中的主要是满足semi-balanced BST red-black tree. rbtrees
用途:If you need to store a large amount of data and look it up efficiently, consider a red-
black tree. Red-black trees enable the searching in logarithmic time, while still providing
an efficient linear time in-order traversal.
Algorithmic Complexity
算法复杂度主要是研究随着输入的逐渐增大,程序的性能如何。 Big-O notation、Big-theta notation. 不要盲目地优化代码到实际并不需要的输入规模。也即是提前优化可能就做了无用功。
time Complexity
Interrupts and Interrupt Handlers
Interrupts enable hardware to signal to the processor.
中断都设定了相应的中断value :interrupt request(IRQ) lines.
中断响应后,开始执行中断程序,也即是:interrupt handler 又称为 interrupt service routine (ISR)。其中,这个ISR是写在中断驱动里面的(driver)。
中断可能随时来临,所以中断的ISR代码一定要尽可能的短(因为中断本身就是打扰了别的process ,甚至是打扰了另外一个不同line的中断),然而,中断来临总是有非常多的工作要做。为解决二者之间的矛盾,产生了两部分。top half: 就是产生回执,hardware和kernel之间进行实践紧迫的工作。bottom half:对于不是紧急的,放在这里面执行。
有的不同外部设备之间共享同一个interrupt line.这样就需要判断到底具体是哪一个设备进行了中断情况。其他的在同一个line上的设备就退出这个中断响应,不要动作。并且当这个line上的一个设备的中断动作时,整条line的中断都被block,这期间line的中断都不能再动作。这样极大地降低了写中断驱动代码的难度。其他的很多东西和单片机的程序类似。具体例子见下图:
另外,中断和同步有莫大关系。
现在的kernel版本不再使用全局中断开闭功能了。
参考文献: