将进程置于等待队列时中断

时间:2012-05-22 13:46:48

标签: semaphore interrupt critical-section

  

假设有一个进程正在尝试进入关键区域,但由于它被其他进程占用,因此当前进程必须等待它。因此,当进程被添加到信号量的等待队列时,假设有一个中断(电池完成),那么该进程和等待队列会发生什么?

我认为既然电池已经完成,那么这个中断将具有最高优先级,因此将保存将进程置于等待队列的进程的上下文,并且将执行该路由的中断服务例程。 / p>

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

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

2 个答案:

答案 0 :(得分:1)

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

正如评论中所提到的,“电池完成”中断可能被认为是一种特殊情况,仅仅因为机器可能会在不采取任何操作的情况下关闭,在这种情况下,进程+队列将消失。但一般情况下,假设一个非致命中断和一个正常暂停/恢复的操作系统,我认为这两个进程的执行不太可能产生明显影响。

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

在先发制人的多任务操作系统中,也无法保证在中断后立即恢复添加到队列的进程,调度程序可以决定完全激活当前在关键部分或其他进程中的进程。将进程添加到信号量等待队列的进程恢复时会发生什么情况取决于添加它的距离,队列的实现方式以及信号量所处的状态。可能是它永远不会进入等待队列因为它检测到其他进程已经唤醒并离开了关键部分,或者可能是它完成了将自己添加到队列中并暂停,就像没有发生任何事情一样......

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

答案 1 :(得分:0)

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

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

的API
  

中断此主题。

     

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

     

如果在调用wait(),wait(long)或wait(long,int)方法的Object类或者join()方法中阻塞了这个线程,那么(long),join(long,int),sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException

     

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

     

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

     

如果以前的条件都不成立,那么将设​​置该线程的中断状态。

     

中断非活动的线程无需任何效果。