为了给您完整的上下文,我的讨论从观察开始,即我在基于 ARM cortex A8 的 SoC 上运行 SMP linux (3.0.1-rt11),这是一个单处理器。我很想知道禁用 SMP 支持是否会带来任何性能优势。如果是的话,它将对我的驱动程序和中断处理程序产生什么影响。
我做了一些阅读并遇到了两个相关的主题:自旋锁和内核抢占。我做了更多的谷歌搜索和阅读,但这一次我得到的只是一些陈旧和矛盾的答案。所以我想让我试试stackoverflow。
我的疑问/问题的起源是 Linux 设备驱动程序第 3 版第 5 章中的这一段:
自旋锁就其本质而言,旨在用于多处理器系统,尽管就并发性而言,运行抢占式内核的单处理器工作站的行为类似于 SMP 。如果一个非抢占式单处理器系统曾经在锁上自旋,它将永远自旋;没有其他线程能够获得 CPU 来释放锁。出于这个原因,没有启用抢占的单处理器系统上的自旋锁操作被优化为什么都不做,除了那些改变 IRQ 屏蔽状态的操作。由于抢占,即使您从未期望您的代码在 SMP 系统上运行,您仍然需要实现适当的锁定。
我的疑问/问题是:
a) 默认情况下,Linux 内核在内核空间中是抢占式的吗?如果是,这种抢占是否仅限于进程或中断处理程序也可以被抢占?
b) Linux 内核(在 ARM 上)是否支持嵌套中断?如果是,每个中断处理程序(上半部分)是否有自己的堆栈或共享相同的 4k/8k 内核模式堆栈?
c) 如果我禁用 SMP ( CONFIG_SMP
) 和抢占 ( CONFIG_PREEMPT
),我的驱动程序和中断处理程序中的自旋锁是否有意义?
d) 内核如何处理在执行上半部分时引发的中断,即它们将被禁用或屏蔽?
经过一番谷歌搜索后,我发现了这个:
对于没有 CONFIG_SMP 和没有 CONFIG_PREEMPT 编译的内核,自旋锁根本不存在。这是一个出色的设计决策:当没有其他人可以同时运行时,没有理由拥有锁。
如果内核在没有 CONFIG_SMP 的情况下编译,但设置了 CONFIG_PREEMPT,则自旋锁只是禁用抢占,这足以防止任何竞争。在大多数情况下,我们可以将抢占视为等同于 SMP,而不必单独担心。
但是源代码上没有内核版本或日期。谁能确认它是否仍然适用于最新的 Linux 内核?