Linux内核之队列操作

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


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

   struct list_head
   {
         struct list_head *next;
         struct list_head *prev;
   };

   再定义一个宿主:

typedef struct page
   {
          struct list_head list;
          ......
          struct list_head  lru;
          .......
    }page ;

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

   

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

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

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

  By @liupsmail

你可能感兴趣的:(linux,模板,队列,内核,队列操作)