文章

114

粉丝

0

获赞

0

访问

4.4k

头像
2022年(408)计算机学科专业基础综合试题 - 第46题回答
操作系统
发布于2025年12月8日 18:55
阅读数 2


评分及理由

(1)得分及理由(满分8分)

学生作答中,定义了四个信号量A、B、C、E,初值均为0。其代码逻辑为:
T1中:先执行A,然后signal(A);然后wait(C),再执行E和F。
T2中:先执行B,然后wait(A),再执行C和D。
学生还在文字说明中指出“C不需要等待B的信号量”、“D不需要等待C的信号量”、“F不需要等待E的信号量”。

分析:
1. 同步关系分析:根据题目约束,C必须在A和B完成后执行。学生代码中,T2执行C前有wait(A),这保证了A完成后C才能执行,但缺少对B完成的等待(学生说明中认为C不需要等待B,因为B和C在同一线程T2中)。然而,题目要求C必须在A和B都完成后执行,即使B和C在同一线程,也必须保证B先于C执行。由于T2中“执行B”和“执行C”是顺序执行的,没有并发,因此确实不需要额外信号量来保证B先于C,这一点学生的理解和实现是正确的。
2. 对于D必须在C完成后执行:学生在T2中“执行C”后直接“执行D”,是顺序执行,因此不需要信号量,正确。
3. 对于E必须在C完成后执行:学生代码中T1有wait(C),然后执行E,这保证了E在C完成后执行,正确。
4. 对于F必须在E完成后执行:学生在T1中执行E后直接执行F,是顺序执行,因此不需要信号量,正确。
5. 信号量使用:学生使用了signal(A)和wait(C)来实现A->C和C->E的跨线程同步,但缺少一个信号量来实现C->E的同步(学生使用了wait(C),但T2中执行C后没有signal(C))。仔细看学生代码,T2中执行C后没有对信号量C进行signal操作,而T1中wait(C)将永远等待,这是一个严重的逻辑错误。学生可能误将信号量C用于表示“C操作完成”,但未在C完成后signal(C),导致死锁。
6. 信号量命名与初值:学生定义了四个信号量,初值均为0,但实际只用到了A(用于A完成通知)和C(意图用于C完成通知,但未正确signal)。信号量B和E定义但未使用,属于冗余,但不影响核心逻辑判断(不扣分)。

核心错误:T2中执行C后没有signal(C),导致T1中的wait(C)无法被唤醒,同步关系不完整,无法满足E在C完成后执行的约束。这是一个关键的逻辑错误。

根据标准答案,正确的同步至少需要保证A->C和C->E的跨线程同步(即信号量S_AC...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发