1

假设有一个进程试图进入临界区,但由于它被其他进程占用,当前进程必须等待它。那么,当进程被添加到信号量的等待队列时,假设有一个中断来了(ex-battery finished),那么这个进程和等待队列会发生什么?

我认为由于电池已用完,因此此中断将具有最高优先级,因此将保存将进程置于等待队列中的进程的上下文,并将执行此路由的中断服务例程。

然后它将返回到将进程放入队列的进程。

请为此问题提供一些提示/建议。

4

2 回答 2

1

这非常依赖于硬件/操作系统,但是有一些想法:

正如评论中提到的,“电池用完”中断可能被认为是一种特殊情况,仅仅是因为机器可能会在不采取任何行动的情况下关闭,在这种情况下进程+队列将消失。然而,总的来说,假设一个非致命中断和一个正确挂起/恢复的操作系统,我认为这两个进程的执行不太可能有任何明显的影响。

在多核设置中,进程可能不会立即暂停。中断可以由不同的核心处理,您提到的任何一个过程都不​​会更明智。

在抢占式多任务操作系统中,也不能保证添加到队列的进程会在中断后立即恢复,调度程序可以决定激活当前处于临界区的进程或完全激活另一个进程。当进程将自己添加到信号量等待队列恢复时会发生什么取决于添加它的距离、队列的实现方式以及信号量处于什么状态。它可能永远不会进入等待队列因为它检测到另一个进程已经唤醒并离开了临界区,或者它可能是它完成将自己添加到队列中并像什么都没发生一样挂起......</p>

在具有协作多任务操作系统的单核/处理器机器中,我认为您在问题中描述的场景很可能是执行进程被暂停以处理中断,然后恢复,直到它完成将自身添加到队列中并屈服了。

于 2012-05-25T08:47:21.887 回答
0

这取决于实现,但从概念上讲,相同的操作进程应该同时执行将进程添加到等待队列和管理中断,因此被移动到等待的进程将被视为从等待队列中中断。

对于 Java,请参阅 APIThread.interrupt()

中断这个线程。

除非当前线程正在中断自己,这总是允许的,否则会调用该线程的 checkAccess 方法,这可能会导致抛出 SecurityException。

如果此线程在调用Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 时被阻塞, sleep(long), or sleep(long, int), 这个类的方法,那么它的中断状态将被清除,它会收到一个 InterruptedException

如果此线程在可中断通道上的 I/O 操作中被阻塞,则通道将关闭,线程的中断状态将被设置,并且线程将收到 ClosedByInterruptException。

如果此线程在 Selector 中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能带有非零值,就像调用了选择器的唤醒方法一样。

如果前面的条件都不成立,则将设置该线程的中断状态。

中断一个不活动的线程不需要有任何效果。

于 2012-05-24T21:40:32.653 回答