【问题标题】:Do threads/processes have to disable interrupts while executing a critical section线程/进程是否必须在执行关键部分时禁用中断
【发布时间】:2013-02-06 22:53:11
【问题描述】:

让我们考虑一个场景:-

当发生中断时,内核线程获取锁并处于临界区的中间。 中断处理程序运行并到达相同的临界区并尝试获取锁并进入睡眠状态。

这会发生还是在关键部分期间禁用了中断? 采取了哪些措施来避免它?

// Some Code
 Acquire_lock()

Critical section   //Interrupt occurs and arrives to acquire the same lock.

Disable_lock()

【问题讨论】:

  • 您是否有特定的平台,或者这只是一个通用问题?
  • 一个通用问题。假设 x86 机器上的 Linux 内核?

标签: locking interrupt critical-section interrupt-handling


【解决方案1】:

您绝不允许持有锁的代码被尝试获取相同锁的代码中断。如果您的意思是在操作系统内部,则可能需要禁用代码中与也由中断处理程序操作的对象交互的所有中断。

用户空间线程和进程没有这样的问题。没有中断处理程序获取用户空间线程可以获取的锁。如果一个持有用户空间锁的线程被中断,它会在重新调度后立即释放它——用户空间线程仍然可以运行。

【讨论】:

  • 对不起,我没有提到我在谈论内核线程。所以基本上内核线程必须并且应该在进入临界区之前禁用中断?它如何决定应该禁用哪条中断线?还是一般会禁用所有中断?
  • 如果他们要持有一个中断处理程序可能试图获取的锁,他们至少需要禁用该内核上的中断服务。
  • @DavidSchwartz 如果不能错过处理器在临界区执行期间获得的中断怎么办?这种情况如何处理?
  • @XavierGeoffrey 没有错过。硬件只是推迟它。如果您的问题是“如果必须在无法服务的时候服务中断会发生什么”,那么,任何有时间既必须服务又不能服务中断的系统都会被破坏。
  • @DavidSchwartz 是的,这正是我要问的。而且我无法准确理解“破碎”的含义。这是否意味着这种情况永远无法处理?对我来说,这看起来像是实时世界中的合法场景......
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 2012-04-19
  • 2011-07-30
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多