6.2 队列
任何操作系统内核都少不了一种编程模型:生产者和消费者。在该模式中,生产者创造数据,而消费者则反过来,读取消息和处理包,或者以其他方式消费这些数据。实现该模型的最简单的方式是使用队列。生成者将数据推进队列,消费者从队列中摘取数据。消费者获取数据的顺序和推入队列的顺序一致。第一个进入队列的数据一定是第一个离开队列的。队列也称为FIFO(先进先出)。图6-5是一个标准队列的例子。
Linux内核通用队列实现称为kfifo。其实现在lib/kfifo.c中,声明在文件<linux/kfifo.h>。
6.2.1 kfifo
Linux的kfifo和多数其他队列实现类似,提供两个主要操作:enqueue(入队列)和dequeue(出队列)。kfifo对象维护了两个偏移量:入口偏移和出口偏移。入口偏移是指下一次入队列时的位置,出口偏移是指下一次出队列时的位置。出口偏移总是小于等于入口偏移,否则无意义,因为那样说明要出队列的元素根本还没有入队列。
enqueue操作拷贝数据到队列中的入口偏移位置。当上述动作完成后,入口偏移随之加上推入的元素数目。dequeue操作从队列中出口偏移处拷贝数据,当上述动作完成后,出口偏移随之减去摘取的元