缓冲区管理问题

前言

缓冲区管理问题是操作系统中P、V操作部分非常经典的问题!_


缓冲区问题

1. 问题描述

n个进程将字符逐个读入到一个容量为80的缓冲区中(n>1),当缓冲区满后,由输出进程Q负责一次性取走这80个字符。这种过程循环往复,请用信号量和P、V操作写出n个读入进程(P1, P2,…Pn)和输出进程Q能正确工作的的动作序列

2. 问题分析

n个进程对缓冲区之间是互斥关系,而它们和进程Q之间又是同步关系,理解了这一点,根据前面几个P、V操作经典例题的分析,我们知道,同步关系需要2个同步信号量,互斥关系需要一个互斥信号量,大体思路就是如此。

3. P、V操作
semaphore empty = 80; // 空闲缓冲区的数量
semaphore full = 0;   // 缓冲区是否满
semaphore mutex = 1;  // 互斥信号量,保证count,int等能完整执行
int count = 0;        // 表示已写入内容的缓冲区的大小
char[80] Buffer;      // 缓冲区
int in = 0;           // 缓冲区读入游标-读入位置标志位

cobegin
process Pi(i=1,2,...,n) {
    while(true) {
        {读入一个字符到x};
        P(empty);
        P(mutex);
        Buffer[in] = x;
        in = (in + 1) % 80;
        count++;
        if(count == 80) {
            count = 0;  // 从0开始继续计数
            V(mutex);
            V(full);    // 读入满80个字符后提醒Q进程取走
        } else
        	V(mutex);
    }
}

process Q {
    while(true) {
        P(full);
        P(mutex);
        for(int j=0; j<80; j++)
        	read Buffer[j];
        in = 0;
        V(mutex);
        for(int j=0; j<80; j++)
        	V(empty);
    }
}
coend

d=====( ̄▽ ̄*)b

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值