linux - 在内核代码中禁用同步中断

标签 linux operating-system synchronization interrupt

为什么在内核中同步代码时需要禁用中断?

例如,在以下取自 linux schedule() 函数的代码中:

need_resched:
prev = current;
rq = this_rq();

**spin_lock_irq(&rq->lock);** //disables interrupts

switch (prev->state) {
case TASK_INTERRUPTIBLE:
    if (unlikely(signal_pending(prev))) {
        prev->state = TASK_RUNNING;
        break;
    }
default:
    deactivate_task(prev, rq);
case TASK_RUNNING:
    ;
}

spin_lock_irq() 函数禁用中断,但为什么需要它? 假设我没有禁用中断,并且有一个中断来了,那么我将处理它并返回到调度程序并恢复我正在做的事情。

最佳答案

这是必要的,因为可以通过软件和硬件中断进入调度器。

软件中断,例如。 sleep() 调用和线程间通信调用(例如信号量、condvar 或事件信号)可能会更改正在运行的线程集,因此会请求调度程序运行。这些调用具有线程/进程上下文,并在调用内核时发生。

硬件中断,例如。 KB、鼠标、磁盘、NIC 导致驱动程序运行,驱动程序可能希望通过运行调度程序来更改运行线程集,例如。使阻塞等待磁盘读取的线程准备就绪。硬件中断没有线程/进程上下文,并且可以在中断启用时随时发生。

调度程序代码/数据的某些部分不可重入。如果没有为这些部分暂时禁用中断,当调度程序被硬件中断并从驱动程序重新进入时,就会发生困惑。

关于linux - 在内核代码中禁用同步中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24466375/

相关文章:

linux - 典型 Linux 发行版中最旧的代码

linux - 错误 : Cannot find module 'hbsfy'

linux - 如何消除运行 "setsid scp"时出现的对话框?

linux - 如何设置从 sleep 中唤醒的cronjob?

compiler-construction - 机器如何解释二进制?

c - 带消息传递的 IPC

mercurial - 需要同步 Mercurial 和 Team Foundation Server(TFS)

c - 在用户级别 C 中实现信号量

android应用离线模式,本地sqlite数据库同步远程数据库

ios - WatchKit 和 iOS App 的核心数据