操作系统教程(第5版)习题解答

本文详细解析了操作系统中的同步问题,包括单缓冲区、双缓冲区的进程同步策略,以及公共汽车上司机与售票员的同步模型。通过信号量和PV操作,确保了R、M、P进程在读取、处理和打印信息块过程中的正确协作,以及公交运行过程中司机和售票员的有序工作。同时,提出了吸烟者与供应者间利用信号量实现的同步机制,保证了资源的有效分配和使用。

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

第3章 同步,通信与死锁

1.有三个并发进程:R负责从输入设备读入信息块,M负责对信息块进行加工处理,P负责打印输出信息块。现提供(1)一个缓冲区,可放置K个信息块;(2)两个缓冲区,每个缓冲区可放置K个信息块。

试用信号量和PV操作写出三个进程正确工作的流程。

答:(1)进程R,M和P之间存在同步的关系。设置资源信号量sread,初始值为K,用于R进程和M进程之间的同步;资源信号量smanage,初始值为0,用于M进程和P进程之间的同步;资源信号量sprint,初始值为0,用于P进程和R进程之间的同步。

item B[K];  //缓冲区大小
semaphore sread=K;//资源信号量,初始值为K,表示缓冲区中空位的个数,当sread<0时用于阻塞R进程。
semaphore smanage=0;//资源信号量,初始值为0,表示已处理信息块的个数,当smanage<0时用于阻塞M进程。
semaphore sprint=0;//资源信号量,初始值为0,表示可输出的信息块个数,当sprint<0时用于阻塞P进程。

int rptr=0; //R进程输入信息块的位置
int mptr=0;//M进程处理信息块的位置
int pptr=0;//P进程输出信息块的位置
item x;

void R(){
    while(TRUE){
        read(x);//读入信息块保存在x中
        wait(sread);//缓冲区中空的位置减1
        B[rptr]=x;
        rptr=(rptr+1)%K;
        signal(smanage);//当smanage>0时,唤醒M进程
    }
}

void M(){
    while(TRUE){
        wait(smanage); //可处理的信息块个数减1
        x=B[mptr];
        manage(x);
        B[mptr]=x;
        mptr=(mptr+1)%K;
        signal(sprint);//当sprint>0,唤醒P进程
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值