【一篇搞懂】操作系统期末大题:进程同步与互斥 PV操作


一、前言🚀🚀🚀

在这里插入图片描述


本文简介:这是一篇基于b站up主chenchen的小马的一篇个人笔记,视频链接https://www.bilibili.com/video/BV1XG4y1V7M9/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=12384b61e0b367d92ce270fa4eb8fb68! 讲的真的很通俗易懂,所以我便做了如下的笔记。


二、正文:☀️☀️☀️

题型一:利用信号量实现前驱关系

  给出下图,让你利用信号量实现前驱关系

在这里插入图片描述

解题方法:
①有n个箭头,就设n个信号量
②从根节点开始
③有n个前驱节点,就写n个wait(),有n个后继节点,就写n个signal()

#代码块
Semaphore a,b,c,d,e,f,g = 0,0,0,0,0,0,0  # 声明信号量
	begin
		parbegin
			begin S1;signal(a);signal(b);end;
			begin wait(a);S2;signal(c);signal(d);end;
			begin wait(b);S3;signal(e);end;
			begin wait(c);S4;signal(f);end;
			begin wait(d);S5;signal(g);end;
			begin wait(e);wait(f);wait(g);S6;end;
		parend
	end
		

  

题型二:利用信号量实现资源同步与互斥

题:输入进程Input和计算进程Compute共享大小为n的缓冲区,输入进程负责读入数据,并把输入数据放到缓冲区中,计算进程负责从缓冲区中取出数据进行计算,请用信号量机制描述上述进程间的同步关系。
解题步骤:
①有几类进程?(1类:竞争关系;多类:竞争和协作关系)
②确定临界资源
互斥信号量mutex初值为1,资源信号量初值看题目(大小为n的缓冲区)
④打框架,每个进程做什么事
⑤补充P、V操作(先申请资源信号量,再申请互斥信号量。

解:①2类进程:输入Input、计算compute
②缓冲区  ③mutex=1;empty=n;full=0;
# 代码块
Semaphore mutex=1;empty=n;full=0;
	parbegin
		Input(){
			while(true){
				wait(empty);     # 先申请资源信号量
				wait(mutex);     # 后申请互斥信号量
				读数据放缓冲区     # 访问临界资源
				signal(mutex);
				signal(full);
				}
			}

		compute(){
			while(true){
				wait(full); 
				wait(mutex);
				取数据进行计算     # 访问临界资源
				signal(mutex);
				signal(empty);
				}
			}
	parend

注意: 上面代码中,Input()函数中:刚开始wait(empty); 先申请空的缓冲区后会变成满的,所以释放的时候是释放signal(full);
第二个函数compute()同理,先申请full(这里已经是满的缓冲区),然后完了再释放signal(empty)。

  
  
  
Alt

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值