文章目录
- 一、前言🚀🚀🚀
- 二、正文:☀️☀️☀️
- 题型一:利用信号量实现前驱关系
- 题型二:利用信号量实现资源同步与互斥
一、前言🚀🚀🚀
本文简介:这是一篇基于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 # 声明信号量beginparbeginbegin 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;parendend
题型二:利用信号量实现资源同步与互斥
题:输入进程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;parbeginInput(){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)。