题目
有一个教室,只有一个教师,有30张可供学生等待答疑的椅子,如果没有学生,则教师睡觉;如果有一学生进入教室发现教师睡觉,则把他叫醒,教师同时只能给一个同学答疑,讲完题叫下一个学生,下班时间到,老师离开;问问题的学生要站着,进来后要么坐下排队等待(有空位的情况),要么离开(没有空位的情况)。定义信号量[1],写出信号量的初值以及信号量各种取值含义。根据所定义的信号量。请用P、V操作实现教师进程和学生进程的同步算法[2]。
有一个教室,只有一个教师,有30张可供学生等待答疑的椅子,如果没有学生,则教师睡觉;如果有一学生进入教室发现教师睡觉,则把他叫醒,教师同时只能给一个同学答疑,讲完题叫下一个学生,下班时间到,老师离开;问问题的学生要站着,进来后要么坐下排队等待(有空位的情况),要么离开(没有空位的情况)。
定义信号量[1],写出信号量的初值以及信号量各种取值含义。根据所定义的信号量。请用P、V操作实现教师进程和学生进程的同步算法[2]。
题目解答
答案
定义两个信号量:teacherSemaphore 和 studentSemaphore,它们的初始值都应该为 0。
teacherSemaphore: 控制教师的行为。
studentSemaphore: 控制学生的行为。
同步算法:
教师进程:
P(teacherSemaphore); // 等待学生到来
// 此时教师开始答疑
V(studentSemaphore); // 通知学生可以进入教室
学生进程:
// 学生进入教室
P(teacherSemaphore); // 等待教师醒来
// 学生问问题
V(studentSemaphore); // 通知下一个学生可以进入教室
这个同步算法通过信号量 teacherSemaphore 和 studentSemaphore 来确保教师和学生之间的正确互动。教师需要等待学生提问,而学生需要等待教师醒来。
解析
步骤 1:定义信号量
定义信号量 emptySeats 和 teacherStatus。emptySeats 用于控制教室中空闲座位的数量,teacherStatus 用于控制教师的状态。
步骤 2:初始化信号量
emptySeats 的初始值为 30,表示教室中有 30 个空闲座位。teacherStatus 的初始值为 0,表示教师正在睡觉。
步骤 3:教师进程
教师进程使用 P(teacherStatus) 操作等待学生到来,然后使用 V(emptySeats) 操作释放一个空闲座位,表示教师已经完成答疑。
步骤 4:学生进程
学生进程使用 P(emptySeats) 操作检查教室中是否有空闲座位,如果有,则使用 V(teacherStatus) 操作唤醒教师,然后等待教师答疑。
定义信号量 emptySeats 和 teacherStatus。emptySeats 用于控制教室中空闲座位的数量,teacherStatus 用于控制教师的状态。
步骤 2:初始化信号量
emptySeats 的初始值为 30,表示教室中有 30 个空闲座位。teacherStatus 的初始值为 0,表示教师正在睡觉。
步骤 3:教师进程
教师进程使用 P(teacherStatus) 操作等待学生到来,然后使用 V(emptySeats) 操作释放一个空闲座位,表示教师已经完成答疑。
步骤 4:学生进程
学生进程使用 P(emptySeats) 操作检查教室中是否有空闲座位,如果有,则使用 V(teacherStatus) 操作唤醒教师,然后等待教师答疑。