多缓冲区:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/sem.h>
#include<linux/sched.h>
#include<asm/atomic.h>
#include<linux/delay.h>
#define PRODUCT_NUMS 10
#define BUFFER_SIZE 4 //缓冲区个数

MODULE_LICENSE("Dual BSD/GPL");
 
static struct semaphore sem_producer;/*"生产需求证",在产品没有被消费的时候不能再进行生产*/
static struct semaphore sem_consumer;/*"消费证",在有产品的时候(可以获得该锁)才可以消费*/
static char product[12];/*"产品"存放地*/
static int g_Buffer[BUFFER_SIZE]; /*"产品"存放地*/   
static int p_i=0, c_i=0;  

static int producer(void *product);/*生产者*/
static int consumer(void *product);/*消费者*/

 
static int procon_init(void)
{
printk(KERN_INFO"show producer and consumer\n");
//init_MUTEX(&sem_producer);/*购买"生产需求证",并且准许生产*/
sema_init(&sem_producer,4);
init_MUTEX_LOCKED(&sem_consumer);/*购买"消费证",但不可消费*/

kernel_thread(producer,product,CLONE_KERNEL);/*启动生产者*/
kernel_thread(producer,product,CLONE_KERNEL);/*启动生产者*/
kernel_thread(consumer,product,CLONE_KERNEL);/*启动消费者*/
kernel_thread(consumer,product,CLONE_KERNEL);/*启动消费者*/
return 0;
}
static void procon_exit(void)
{
printk(KERN_INFO"exit producer and consumer\n");
}
/*
* 生产者,负责生产十个产品
*/
static int producer(void *p)
{

int i;

printk("producer [%d] start ...\n",current->pid);
for(i=0;i<PRODUCT_NUMS;i++) { /*总共生产十个产品*/
/* 查看"生产需求证",如果产品已经被消费,
* 则准许生产。否则在此等待直到需要生产
*/
down(&sem_producer);
 
printk(KERN_INFO"producer [%d] produce %d\n",current->pid,p_i);/*生产者提示已经生产*/
g_Buffer[p_i]=i;
p_i=(p_i+1)%BUFFER_SIZE;
up(&sem_consumer);/*为消费者发放"消费证"*/
}
printk(KERN_INFO"producer [%d] exit ... \n",current->pid);
return 0;
}
/*
* 消费者,如果有产品,则消费产品
*/
static int consumer(void *p)
{

printk("consumer [%d] start ...\n",current->pid);
for(;;) {
msleep(100);
if(g_Buffer[c_i]>=PRODUCT_NUMS )
        break;
down_interruptible(&sem_consumer);

printk(KERN_INFO"consumer [%d] consume %d\n",current->pid,c_i);/*消费者提示获得了产品*/

  c_i=(c_i+1)%BUFFER_SIZE;
 
up(&sem_producer);/*向生产者提出生产需求*/
}
printk(KERN_INFO"consumer [%d] exit ... \n",current->pid);
return 0;
}
module_init(procon_init);
module_exit(procon_exit);
MODULE_DESCRIPTION("producer and consumer Module");
MODULE_ALIAS("a simplest module");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值