问题标签 [smp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4819 浏览

c - 了解最新(3.0.0 及以上)Linux 内核中 CONFIG_SMP、自旋锁和 CONFIG_PREEMPT 之间的联系

为了给您完整的上下文,我的讨论从观察开始,即我在基于 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 内核?

0 投票
4 回答
14045 浏览

language-agnostic - 原子操作是如何在硬件层面实现的?

我知道在汇编语言级别的指令集架构提供了比较和交换以及类似的操作。但是,我不明白芯片如何能够提供这些保证。

正如我想象的那样,指令的执行必须

  1. 从内存中获取一个值
  2. 比较值
  3. 根据比较,可能在内存中存储另一个值

是什么阻止了另一个内核在第一个内核获取它之后但在它设置新值之前访问内存地址?内存控制器是否管理这个?

编辑:如果 x86 实现是秘密的,我很高兴听到任何处理器系列是如何实现它的。

0 投票
1 回答
3791 浏览

linux-kernel - NUMA 和 SMP 上的 Linux 调度程序

我想知道 schedule() 函数的副本是在每个处理器上运行,还是只是为每个处理器运行一个 schedule()。

如果在每个处理器/核心上运行 schedule() 的副本,进程如何分派到特定的 CPU/cpu 运行队列。它是负载均衡器的工作吗?是否只有一个负载均衡器为所有 CPU 运行,还是使用标志/通信方法以分布式方式完成?

ps-我知道调度类等的工作,但我很难弄清楚各种运行队列之间的进程分布。

0 投票
1 回答
394 浏览

c++ - 使用 QAtomicInt 作为内存围栏

再说一次关于无锁的事情......

假设我实现了一个简单的基于数组的整数循环 FIFO。FIFO 由 2 个线程单生产者、单消费者访问。读取和写入索引始终在访问项目后更新。在单个 CPU 上,这将是安全的(假设索引的更新操作是原子的),因为只有一个线程具有对索引的写访问权限。在 SMP 机器上,这可能会导致问题,因为两个 CPU 可能会由于其缓存和重新排序而看到不同的索引表示。

QT 具有跨平台原子变量,它们也实现了内存栅栏,使用 QAtomicInt 会使 fifo 实现 SMP 安全还是我忽略了什么?

0 投票
0 回答
1457 浏览

android - wait_event_interruptible_timeout 总是过期,即使唤醒事件及时发生

我有一个问题,关于在具有先发制人的 linux 3.0 内核的 Android 嵌入式平台(基于 Exynos5dual)上 wait_event 和 wake_up 的奇怪行为。在具有非抢占式内核(任何版本)的普通 SMP 笔记本电脑上不会发生这种情况

我们有一个带有经典睡眠/唤醒场景的 linux 设备驱动程序,这就是发生的情况:

标志的所有读写都是原子的,并且已经使用了从 atomic bitops(内核设置/测试位)到 volatile atomic_t,再到使用 atomic_t vars 对每个读/写使用内存屏障(根据this

如果 TaskA 实际上开始等待(wait_event_* 内核函数首先检查条件,因此可能并非总是如此),那么它会等待完全超时,而不是在标志更改值并调用 wake_up() 时被 taskB 唤醒。

我们怀疑这两个任务发生在不同的内核上。Core1 在 wait_event_..() 之后进入深度睡眠,并且无法被 Core2 上发生的 wake_up_interruptible() 唤醒。

有谁知道这是真的,还是其他原因?

注意:如果我们保存 sleeper 的任务结构 ptr,然后在(除此之外)wake_up_interruptible() 之前执行 wake_up_process (saved_ptr),问题似乎就消失。我们发现这不是最优的,想知道是否有更好的方法。

0 投票
1 回答
2746 浏览

windows - Windows 上的 Pin 处理器 CPU 隔离

在我主要工作的 linux 中,我们使用一种称为 CPU 隔离的技术,它可以有效地将进程锁定在处理器上,并阻止处理器运行其他任何东西。我们的内核人员做了一些魔术来处理中断。

在 Windows 中,我发现的最接近的东西是一个相似性概念,它似乎将进程/线程绑定到处理器。但它不能保证处理器仅运行该进程/线程,这意味着仍然可能存在上下文切换和其他抖动。

有没有办法在 Windows 上隔离 CPU 以获得半确定性的运行时间?

0 投票
1 回答
3680 浏览

assembly - 如何使用 APIC 创建 IPI 以在 x86 程序集中为 SMP 唤醒 AP?

在启动后环境(无操作系统)中,如何使用 BSP(第一个内核/处理器)为 AP(所有其他内核/处理器)创建 IPI?本质上,从一个内核开始时如何唤醒并设置其他内核的指令指针?

0 投票
1 回答
7127 浏览

linux - percpu 指针在 Linux 内核中是如何实现的?

在多处理器上,每个内核都可以有自己的变量。我认为它们是不同地址中的不同变量,尽管它们在同一个进程中并且具有相同的名称。

但我想知道,内核如何实现这一点?它是否会分配一块内存来存放所有 percpu 指针,并且每次将指针重定向到某个地址时都会使用 shift 或其他东西?

0 投票
2 回答
5703 浏览

linux - 如何使用 Linux 内核中的内存屏障

内核源码 Documentation/memory-barriers.txt 中有一个说明,像这样:

在没有干预的情况下,CPU 2 可能会以某种有效的随机顺序感知 CPU 1 上的事件,尽管 CPU 1 发出了写屏障:

我不明白,因为我们有一个写屏障,所以,任何存储都必须在执行 C = &B 时生效,这意味着 B 将等于 2。对于 CPU 2,B 在获得值时应该是 2 C,也就是&B,为什么它会认为B是7。我真的很困惑。

0 投票
1 回答
707 浏览

kernel - Linux内核BUG()调用不挂内核

我正在运行旧版本的 linux 代码(2.6.27)。我定义了 CONFIG_BUG=y 和 HAVE_ARCH_BUG 。所以我在 asm-x86/bug.h 中使用 BUG() 定义而不是 asm-generic。我看到当我安装一个测试模块(它只有一个 BUG() 调用)时,它不会使盒子崩溃。我能够进入控制台。这是一个 SMP 系统,所以我希望如此。我的问题是,按照设计,BUG() 是否应该像恐慌一样挂起盒子?如果是这样,为什么它不在这个内核上?

谢谢穆拉利