C 为什么中断处理程序(ISR)无法睡眠?

C 为什么中断处理程序(ISR)无法睡眠?,c,linux,interrupt,C,Linux,Interrupt,我很困惑为什么不能睡觉?我对同一问题有两种看法:- 中断处理程序不可调度?因为它没有任务结构 如果处理程序休眠,那么系统可能会挂起,因为系统时钟中断被屏蔽,无法安排休眠进程 中断处理程序是否可调度, 但是低优先级系统时钟中断 被这些更高优先级的中断所掩盖, 不能安排吗 请给我一个很好的例子。当中断发生时,处理器进入异常状态(中断上下文)。 发生这种情况时,计划程序将被禁用,直到处理器退出此状态。如果将一个任务置于睡眠状态,该任务将进入等待队列,并通知调度程序将另一个任务退出队列。如果它发生在中断

我很困惑为什么不能睡觉?我对同一问题有两种看法:-

  • 中断处理程序不可调度?因为它没有任务结构

  • 如果处理程序休眠,那么系统可能会挂起,因为系统时钟中断被屏蔽,无法安排休眠进程

  • 中断处理程序是否可调度,
    但是低优先级系统时钟中断
    被这些更高优先级的中断所掩盖

    不能安排吗


    请给我一个很好的例子。当中断发生时,处理器进入异常状态(中断上下文)。 发生这种情况时,计划程序将被禁用,直到处理器退出此状态。如果将一个任务置于睡眠状态,该任务将进入等待队列,并通知调度程序将另一个任务退出队列。如果它发生在中断上下文中,则在我们完成此上下文之前没有调度程序,处理器挂起,因为我们从未完成中断。具体发生什么取决于处理器。
    一种解决方案是在线程中运行实际的中断代码——这称为线程中断,这是实时补丁中的配置之一,使linux“硬实时”

    当中断发生时,处理器进入异常状态(中断上下文)。 发生这种情况时,计划程序将被禁用,直到处理器退出此状态。如果将一个任务置于睡眠状态,该任务将进入等待队列,并通知调度程序将另一个任务退出队列。如果它发生在中断上下文中,则在我们完成此上下文之前没有调度程序,处理器挂起,因为我们从未完成中断。具体发生什么取决于处理器。 一种解决方案是在线程中运行实际的中断代码——这称为线程中断,这是实时补丁中使linux“硬实时”的配置之一

    在Linux中,您不能在中断处理程序中休眠,因为它们没有执行线程的支持。换句话说,它们不是可调度的实体

    大多数系统将中断处理分成两半,通常称为上半部分和下半部分。上半部分运行得非常快,在中断发生时中断(实际上是作为)正在执行的任何操作。上半部分本身没有线程。因此,上半部分无法睡眠,因为睡眠完成时没有任何可安排的时间

    在Linux中,您不能在中断处理程序中休眠,因为它们没有执行线程的支持。换句话说,它们不是可调度的实体

    大多数系统将中断处理分成两半,通常称为上半部分和下半部分。上半部分运行得非常快,在中断发生时中断(实际上是作为)正在执行的任何操作。上半部分本身没有线程。因此,上半部分无法睡眠,因为睡眠完成时没有任何可安排的时间


    系统可能挂起-为什么可能?为什么您认为这是一种可能性?可能重复:,请参见为什么这有一个C标记?这是一个操作系统问题:(系统可能会挂起-为什么可能?为什么你认为这是一种可能性?可能的重复:,另请参阅为什么这有一个C标记?这是一个操作系统问题:(嗨,MSC,仍然没有得到问题。你说的“由线程支持”是什么意思,是指被中断的进程吗?中断处理程序有任务结构吗?我们可以在中断上下文中调用调度程序吗?嗨,MSC,仍然没有得到问题。你说的“由线程支持”是什么意思,是指被中断的进程吗?中断处理程序有任务结构吗?我们可以在中断上下文中调用调度程序吗?Hi Liran Ben,给定在中断上下文中调用调度程序的链接,我非常困惑不使用睡眠的原因。外部中断处理程序不能睡眠或屈服,这排除了调用lock_acquire()的可能性,螺纹_屈服(),和许多其他函数。在中断上下文中睡眠也会有效地使被中断的线程处于睡眠状态,直到中断处理程序再次被调度并返回。这对不幸的线程不公平,如果处理程序等待睡眠线程释放锁(例如,释放锁),则会死锁。Hi Liran Ben,给定链接在中断上下文中调用调度程序,我非常困惑不使用睡眠的原因。外部中断处理程序不能睡眠或屈服,这排除了调用lock_acquire()、thread_yield()的可能性,和许多其他函数。在中断上下文中睡眠也会有效地使被中断的线程处于睡眠状态,直到中断处理程序再次被调度并返回。这对不走运的线程不公平,如果处理程序等待睡眠线程释放锁等,就会死锁。