PV操作每日一题-考试问题

336 阅读2分钟

考试问题


刚做的一道电科的模拟题,难度只能说适中,但题目有点不严谨,自己稍加了修改,不对之处欢迎私信。

一、问题描述

📄:

某学校即将进行期末考试,每个考场有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);
    }
}

对信号量:

  1. 一组学生是否到齐、全部考完
  2. 一组答题信号
  3. 当前学生数量,以及互斥访问它的信号量
  4. 最后是互斥访问门的信号量

对学生进程:

  1. 进门
  2. 等待答题,答题,交卷
  3. 出门

对老师进程:

  1. 进门
  2. 等学生到齐,发答题信号
  3. 等学生走完,封装卷子
  4. 出门

三、碎碎念

🎈这个题目有点像加强版的读者写者问题,就是过程复杂了丢丢。