文章
35
粉丝
0
获赞
0
访问
1.5k
评分及理由
(1)信号量定义及初值(满分2分)
得分:1分
理由:学生定义了四个信号量:seat(初始值10,表示座位数)、mutex(初始值1,用于取号机互斥)、num(初始值0,表示等待顾客数)、Sever(初始值1,表示服务窗口)。其中,seat和mutex的定义正确,num的含义与标准答案中的full类似(但标准答案中full表示等待人数,这里num也表示等待服务人数,含义正确)。但Sever信号量定义错误,标准答案中服务窗口不需要信号量表示,因为营业员是主动叫号,服务窗口本身是资源,但这里通过Sever信号量试图表示服务窗口的互斥,实际上营业员每次只能服务一个人,但同步关系错误。Sever信号量初始值1表示互斥,但这里误用了它来实现同步,导致逻辑错误。扣1分。
(2)顾客进程实现(满分3分)
得分:1分
理由:顾客进程中,P(seat)正确(相当于P(empty)),P(mutex)和V(mutex)保护取号机正确,V(num)正确(相当于V(full))。但错误在于:①"等待取号"是冗余操作,且没有实际意义;②"等待叫号"后直接P(Sever),这里试图通过P(Sever)来等待服务,但Sever是互斥信号量,初始为1,会导致顾客直接进入服务,而没有等待营业员叫号的同步操作。标准答案中需要等待营业员叫号(通过P(service_i)),这里缺少了同步信号量。扣2分。
(3)营业员进程实现(满分3分)
得分:1分
理由:营业员进程中,while(TRUE)循环正确,但逻辑顺序错误:先"叫号"(但叫号没有同步机制),然后P(num)(相当于P(full)),但P(num)应该在叫号之前,因为需要先检查是否有顾客等待。然后"为客户服务"后V(Sever)和V(seat)。这里V(Sever)错误,因为Sever是互斥信号量,V(Sever)释放后允许下一个顾客进入服务,但营业员还没有完成服务,会导致多个顾客同时获得服务的逻辑错误。标准答案中营业员应该先P(full)再操作座位区,然后叫号并V(service_i)来通知顾客。这里缺少了叫号的同步机制,且信号量使用错误。扣2分。
题目总分:1+1+1=3分
登录后发布评论
暂无评论,来抢沙发