题目源于《操作系统原理》孟庆昌等编著。
可配合以下链接“食用”:
【考研】操作系统——同步互斥问题(P、V操作)2_住在阳光的心里的博客-CSDN博客
【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第二章_住在阳光的心里的博客-CSDN博客
【考研】操作系统:2019年真题43(同步互斥问题)_住在阳光的心里的博客-CSDN博客_有n位哲学家围坐在一张圆桌边
【考研】操作系统:2015年真题45(同步互斥问题)_住在阳光的心里的博客-CSDN博客_有ab两人通过信箱进行辩论
18.假定一个阅览室最多可容纳100人,读者进入和离开阅览室时都必须在阅览室门口的一张登记表上做标识(进入时登记,离开时去掉登记项),而且每次只允许一人登记或去掉登记。问:
① 应编写几个程序完成此项工作? 程序的主要动作是什么? 应设置几个进程? 进程与程序间的对应关系如何?
② 用P、V操作写出这些进程的同步通信关系。
解: ① 完成此项工作可编写一个或两个程序(函数),要求:
● 每个读者对应一个进程。
● 每个读者的动作包括:
■ 人室前查表、登记一一 register( )。
■ 进入室内,阅读书籍。
■ 出室时删除登记项一一 delete( )。
② 信号量:
● S一一座位情况, 初值为100。
● mutex一一互斥使用登记表, 初值为1。
// 第一种解法(一个函数):
每位读者进程:
p(S); // 判断是否有座位
p(mutex); //互斥访问登记表
查表,登记;
V(mutex);
入室,阅读;
p(mutex); //互斥访问登记表
出室查表,删除登记项;
V(mutex);
V(S); //出室后座位加一
// 第二种解法(两个函数,用C语言描述):
typedef int semaphore;
semaphore s = 100;
semaphore mutex = 1;
void main() {
register();
reading();
delete();
}
void register(){
P(S); //入室,座位减一
P(mutex);
Check_register(); //检查登记表
V(mutex);
}
void delete()
{
P(mutex);
Check_delete(); //删除登记表
V(mutex);
v(S); //出室,座位加一
}