考试问题
刚做的一道电科的模拟题,难度只能说适中,但题目有点不严谨,自己稍加了修改,不对之处欢迎私信。
一、问题描述
📄:
某学校即将进行期末考试,每个考场有N个学生,1个老师。无论进出,考场门口每次只能通过一人,采用先来先进,先做完先走人。规定:当N个学生全部进入考场后,老师才能发卷子;学生需要等待老师的开考信号发出才可答题;学生交卷后即可走,老师需要等待所有学生交卷后将试卷封闭后才可离开考场。假设把老师和学生均看作进程,请问PV操作解决上述问题中的同步与互斥,并说明信号量及初值的含义。
二、问题求解
🔑:
int count=0; //考场目前学生数
semaphore empty=0; //考场学生是否全部走完
semaphore full=0; //N个考生到齐
semaphore start=0; //开考信号
semaphore end=0; //所有考试是否交卷
semaphore door=0; //互斥进出考场门
smeaphore mutexCount=0; //互斥访问count
Student-i(int i=1,2,...,N)
{
while(1)
{
//进考场
P(door);
进门;
V(door);
P(mutexCount);
count++;
if(count==N)
{
V(full);
}
V(mutexCount);
//答题交卷
if(start==1)
{
答题;
写完交卷;
}
P(mutexCount);
count--;
if(count==0)
{
V(empty);
}
V(mutexCount);
//出考场
P(door);
出门;
V(door);
}
}
Teacher()
{
while(1)
{
P(door);
进门;
V(door);
P(full);
发卷子;
start=1;
P(empty);
封装试卷;
P(door);
出考场;
V(door);
}
}
对信号量:
- 一组学生是否到齐、全部考完
- 一组答题信号
- 当前学生数量,以及互斥访问它的信号量
- 最后是互斥访问门的信号量
对学生进程:
- 进门
- 等待答题,答题,交卷
- 出门
对老师进程:
- 进门
- 等学生到齐,发答题信号
- 等学生走完,封装卷子
- 出门
三、碎碎念
🎈这个题目有点像加强版的读者写者问题,就是过程复杂了丢丢。