为什么在内核中同步代码时需要禁用中断?
例如,在以下取自 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/