双向链表在内核中的超然地位

玩过内核的人都知道,linux内核中的链表是比较有特色的。利用一个container_of宏来实现链表到数据的计算,不可谓不精妙。(如果不知道的同志赶快上网看看)为什么linux内核要用双向链表?为什么不用单向链表?这是因为双向链表的灵活性,两边都有指针域,更方便增加与删除。有的同志可能会说只要存了单向链表上一步的指针,一样可以删,双向链表没必要。还是那句话,请先看看linux内核中的代码,再来评论。以linux内核中的SKB为例。在传入的时候传的是SKB的指针,传的不是链表,这样反着找前一个就很麻烦了,为什么不用链表?因为SKB才是数据,链表只是用来把SKB串起来,大多数情况下我们是操作SKB的成员,而不是链表,因此,用SKB指针可以更直接的操作数据。我们可以发现在linux内核中除了在一定的条件下将数据插入我们需要管理的链表,在一定的条件下再将数据从链表中删掉以外,更多的是操作我们的数据。这给我们提供了很多指引,教导我们怎么样设计更好的软件,写出更牛X的代码。为什么我之前有篇文章一再谈到悟性很重要,天赋很重要,兴趣很重要,代码就扔那,关键看你能看到多少。各位同志千万不要将身边的所谓高手当作自已的目标,我们要以世界顶级高手为目标,这样就算达不到,也不会太挫。有些东西无论是书,还是BLOG中,是不会说的太明白的,更多的是靠自已领悟,自已去动脑子。

linux内核中有用到hash链表,就我所看到的,也全是一个哈希表再加双向链表来实现的。有时候发现,想从难处想,做从易处做不是没道理的。linux内核的作者们就从活生生的事例向我们证明了这一点。

你可能感兴趣的:(linux,Blog)