linux - 为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占

标签 linux linux-kernel interrupt spinlock preemption

我最近正在阅读 Linux 内核开发,我有几个与禁用抢占相关的问题。

  1. 在第 7 章的“中断控制”部分,它说:

    Moreover, disabling interrupts also disables kernel preemption.

    我还从书上看到,在以下情况下会发生内核抢占:

    When an interrupt handler exits, before returning to kernel-space.
    When kernel code becomes preemptible again.
    If a task in the kernel explicitly calls schedule()
    If a task in ther kernel blocks (which results in a call to schedule())

    但我无法将禁用中断与这些情况联系起来。

  2. 据我所知,自旋锁会通过 preempt_disable() 函数禁用抢占。

    帖子What exactly are "spin-locks"? 说:

    On a single core machine a spinlock is simply a "disable interrupts" or "raise IRQL" which prevents thread scheduling completely.

    preempt_disable() 是否通过禁用中断来禁用抢占?

最佳答案

我不是调度大师,但我想解释一下我的看法。 这里有几件事。

  1. preempt_disable() 不禁用 IRQ。它只是增加了一个thread_info->preempt_count 变量。
  2. 禁用中断也会禁用抢占,因为调度程序在此之后不工作 - 但仅在单 CPU 机器上。在 SMP 上这还不够,因为当您关闭一个 CPU 上的中断时,另一个/其他人仍然异步地/做一些事情。
  3. Big Lock(意思是 - 关闭所有 CPU 上的所有中断)正在显着降低系统速度 - 所以这就是它不再被使用的原因。这也是 preempt_disable() 不关闭 IRQ 的原因。

可以看出什么是preempt_disable()。尝试这个: 1. 获取自旋锁。 2.调用schedule()

在 dmesg 中,您会看到类似“BUG:原子调度”的内容。当调度程序检测到您的进程处于原子(非抢占式)上下文中但它自行调度时,就会发生这种情况。

祝你好运。

关于linux - 为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769768/

相关文章:

linux - Bash 字符串替换,查找父路径

memory-management - 确定障碍物(栅栏)的使用位置

FriendlyARM 的 Linux 内核编译器

ARM GIC 中断饥饿

multithreading - 从线程化ISR交换数据的安全简便方法是什么? (树莓派)

linux - 级别触发的中断处理和嵌套中断

c++ - wxWebConnect 的 Linux 动态链接错误

c - Linux 中另一个进程的重复文件描述符(没有 sendmsg)

mysql - 使用 mysqladmin 更改 MySQL 用户名

audio - 为 Cyclone V SoC (Linux) 创建简单的音频驱动程序