(7 分)下表给出了整型信号量 S 的 wait和
(7 分)下表给出了整型信号量 S 的 wait()和 signal()操作的功能描述,以及采用开/ 关中断指令实现信号量操作互斥的两种方法。
| 功能表述 | 方法1 | 方法2 |
Semaphore S; Wait( S ){ while( S <= 0 ); S = S-1; } signal( S ){ S = S+1; } | Semaphore S; wait( S ){ 关中断; while( S <= 0 ); S = S-1; 开中断; } signal( S ){ 关中断; S = S+1; 开中断; } | Semaphore S; wait( S ){ 关中断; while( S <= 0 ){ 开中断; 关中断; } S = S-1; 开中断; } signal( S ){ 关中断; S = S+1; 开中断; } |
请回答下列问题。
(1)为什么在 wait()和 signal()操作中对信号量 S 的访问必须互斥执行?
(2)分别说明方法 1 和方法 2 是否正确。若不正确,请说明理由。
(3)用户程序能否使用开/关中断指令实现临界区互斥?为什么?
【答案解析】
(1)因为信号量 S 是能够被多个进程共享的变量,多个进程都可以通过 wait()和 signal() 对 S 进行读、写操作。所以,在 wait()和 signal()操作中对 S 的访问必须是互斥的。
(2)方法 1 是错误的。在 wait()中,当 S<=0 时,关中断后,其他进程无法修改 S 的值, while 语句陷入死循环。方法 2 是正确的。
(3)用户程序不能使用开/关中断指令实现临界区互斥。因为开中断和关中断指令都是特权指 令。
答案
暂无答案