2021 操作系统 同步问题设计 解答题
第 45 题

下表给出了整型信号量 S 的 wait() 和 signal() 操作的功能描述,以及采用开/关中断指令实现信号量操作互斥的两种方法。

功能描述

Semaphore S;

wait(S) {
    while (S <= 0);
    S = S-1;
}






signal(S) {
    S = S+1;
}

方法 1

Semaphore S;


wait(S) {
    关中断;
    while(S <= 0);
    S = S-1;
    开中断;
}


signal(S) {
    关中断;
    S = S+1;
    开中断;
}

方法 2

Semaphore S;

wait(S) {
    关中断;
    while(S <= 0) {
        开中断;
        关中断;
    }
    S = S-1;
    开中断;
}

signal(S) {
    关中断;
    S = S+1;
    开中断;
}

请回答下列问题。

(1) 为什么在 wait() 和 signal() 操作中对信号量 S 的访问必须互斥执行?

(2) 分别说明方法 1 和方法 2 是否正确。若不正确,请说明理由。

(3) 用户程序能否使用开/关中断指令实现临界区互斥?为什么?

同步问题设计

[tag_link]

1)信号量S是能被多个进程共享的变量,多个进程都可通过 wait() 和 signal() 对S进行读、写操作。所以,wait() 和 signal() 操作中对 S 的访问必须是互斥的。

2)方法 1 错误。在 wait() 中,当S≤0时,关中断后,其他进程无法修改 S 的值,while语句陷入死循环。方法 2 正确。方法 2 在循环体中有一个开中断操作,这样就可以使其他进程修改S的值,从而避免 while 语句陷入死循环。

3)用户程序不能使用开/关中断指令实现临界区互斥。因为开中断和关中断指令都是特权指令,不能在用户态下执行,只能在内核态下执行。