操作系统中生产者/消费者问题(一)

本文详细介绍了生产者消费者模型的基本概念及其同步机制。通过两个场景——单一缓冲区和多个缓冲区,展示了如何使用信号量来协调生产者和消费者之间的同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者/消费者是个典型的进程同步问题,只有生产者生产出来东西了,消费者才能消费
也就是说,生产者生成出来一个东西,然后通知消费者,(东西好了,快来拿吧),而消费者则查看缓冲器里面有没有东西,若没有则会通知生产者生产东西,这样一个钟相互合作的进程同步问题。

一、一个生产者,一个消费者,一个缓冲器
分析:
首先需要一个信号量用于计数剩余空的缓冲器的数量sp = 1。
需要一个存放数据的缓冲器buffer;
因为有两个人(生产者,消费者)要清楚知道缓冲器的状况(满还是空),所以还需要一个信号量sc = 0,用于说明空寄存器的个数。

int buffer;  
Semaphore sp = 1,sc = 0;  

process producer(void)  
{  
    while(1)  
    {   
        {生产一个产品producer};  
        p(sp);  
        Buffer = product;  
        v(sc);          //唤醒消费者  
    }  
}  
process consumer(void)  
{  
    while(1)  
    {   
        p(sc);  
        {取走缓冲器中的产品};  
        v(sp);        //唤醒生产者  
        {消费该产品};  
    }  
}  

二、一个生产者,一个消费者和n个缓冲器
这个和上面差不多,也是一个一个往缓冲器里面放东西,生产者看到有缓冲器是空就会往里面放东西,但还是一个一个放,所以只要修改上面程序将buffer改为buffer[k],然后k=(++k)%n,计数就行。

int buffer[n],k = 0, t = 0;  
Semaphore sp = 1,sc = 0;  

process producer(void)  
{  
    while(1)  
    {   
        {生产一个产品producer};  
        p(sp);  
        Buffer[k] = product;  
        k = (++k)%n;  
       v(sc);          //唤醒消费者  
    }  
}  

process consumer(void)  
{  
    while(1)  
    {   
        p(sc);  
        {取走缓冲器中的产品};  
        t = (++t)%n;  
        v(sp);        //唤醒生产者  
        {消费该产品};  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值