Linux内核之队列操作

队列的操作中,一般都是为每一个队列写一个队列操作函数,普通的程序多写几个队列操作函数可能并不会增加太多的负担,但是对于Linux内核,里面使用了很多的队列操作,如果为每个队列都写一个队列操作函数这将是一件很多麻烦的事。所以我们想是否可以写一个模板让适合于所有的队列操作。

当然是可行的,看一下linux内核中是如何实现的吧!

  • 定义一个结构体当作寄宿者:

    1
    2
    3
    4
    5
    struct list_head
    {
    struct list_head *next;
    struct list_head *prev;
    };
  • 再定义一个宿主:
1
2
3
4
5
6
7
typedef struct page
{
struct list_head list;
...
struct list_head lru;
...
}page ;

通过将寄宿者寄宿在宿主中,我们就可以只对寄宿者进行队列操作。

现在我们还要思考一个问题,就是我们只是对寄宿者进行队列操作,那我们如何在知道寄宿者指针的情况下找到宿主呢?其实这个问题还是很简单地,现在我们知道了寄宿者的指针位置要找到宿主的指针地址,只要知道寄宿者的指针相对于宿主指针的偏移量就可以了。下面给出代码:

1
d=(unsigned long )(&((struct page *)0)->list);

其中d就是list相对于page的偏移量。