问题标签 [spinlock]
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.
linux-kernel - 自旋锁无法保护多核系统上的关键部分
我有一个字符设备驱动程序,它导致多核系统上的系统死锁。写调用有一个由自旋锁 (spin_lock_irqsave) 保护的临界区。ISR 也必须获得此锁才能完成其任务。如果在一个内核上调用 ISR,而写入正在另一个内核上执行临界区,则会由于看门狗定时器检测到 ISR 内核上的硬锁定而发生恐慌。写入过程永远不会返回完成执行。写进程不应该继续在它的核心上执行,释放锁以允许其 ISR 中的另一个核心运行吗?
关键部分大约需要 5us 才能完成。5 秒后发生硬锁定。
我假设我做错了什么,但不知道是什么。
感谢任何帮助!
c - Linux 内核:Spinlock SMP:为什么 spin_lock_irq SMP 版本中有 preempt_disable()?
Linux内核中的原始代码是:
我认为禁用本地 IRQ 后没有执行路径可以抢占当前路径。
因为所有常见的硬 IRQ 都被禁用,所以应该不会发生软中断,也不会出现启动调度轮的滴答声。我认为目前的道路是安全的。那么为什么会有一个preempt_disable()
?
linux - 竞争 futex 时系统 CPU 使用率高
我观察到,当 linux futexes 竞争时,系统会在自旋锁上花费大量时间。我注意到这是一个问题,即使不直接使用 futex,但在调用 malloc/free、rand、glib 互斥调用和其他调用 futex 的系统/库调用时也是如此。有没有办法摆脱这种行为?
我正在使用带有内核 2.6.32-279.9.1.el6.x86_64 的 CentOS 6.3。我还尝试了直接从 kernel.org 下载的最新稳定内核 3.6.6。
最初,问题发生在具有 16GB RAM 的 24 核服务器上。该进程有 700 个线程。使用“perf record”收集的数据表明,自旋锁是从 __lll_lock_wait_private 和 __lll_unlock_wake_private 调用的 futex 调用的,并且正在消耗 50% 的 CPU 时间。当我使用 gdb 停止该进程时,回溯显示对 __lll_lock_wait_private __lll_unlock_wake_private 的调用是由 malloc 和 free 进行的。
我试图减少这个问题,所以我编写了一个简单的程序,表明确实是 futexes 导致了自旋锁问题。
启动 8 个线程,每个线程执行以下操作:
我在一台 8 核机器上运行它,它有足够的 RAM。
使用“top”,我观察到机器空闲 10%,用户模式 10%,系统模式 90%。
使用“perf top”,我观察到以下内容:
我希望这段代码在自旋锁中花费一些时间,因为 futex 代码必须获取 futex 等待队列。我还希望代码在系统中花费一些时间,因为在这段代码中,用户空间中运行的代码非常少。然而,50% 的时间花在自旋锁上似乎是多余的,尤其是当这个 cpu 时间需要做其他有用的工作时。
c - C中没有自旋锁的非阻塞套接字接受
可能重复:
唤醒线程在 accept() 调用时被阻塞
我正在编写一个小型服务器,它监听连接(接受它们并将它们传递给工作线程),直到发送自定义停止信号。
如果我使用阻塞套接字,那么我的主接受循环不能在发送自定义停止信号时中断。但是,我希望避免使用非阻塞套接字进行忙等待/自旋锁循环。
我想要的是让我的主接受循环阻塞,直到接收到连接或发送停止信号。
这在Linux上的C中可能吗?
非常感谢。
linux-kernel - Linux 内核转储:如何获取自旋锁的所有者
我有一个在 24 核系统上生成的 linux 内核转储。大多数任务都卡在自旋锁上。有没有办法获得自旋锁的所有者?
c - spinlock_t 在第一次使用时已经锁定
嗨,我是第一次编写内核(2.6),我在使用自旋锁时遇到了问题。
我正在尝试添加这个系统调用(inserisci_nodo),它外部化一个结构(一个ibrid列表哈希表)并尝试在这个结构中添加一个节点(Persona),如果节点已经存在,它将被更新。
我在第一次“更新”时遇到问题,事实上,如果我尝试插入所有新节点,它就可以工作!但是如果我尝试插入一个已经存在的节点,这似乎已经被锁定了。我不明白为什么。
这是代码。
对不起,代码上的意大利语,我在代码上添加了一些英文注释。
这是两个结构(散列表和“角色”(节点))。
“lookup(key)”和“hash(key)”是从结构中获取节点的两个简单函数。
我希望你对此有一个想法:)
再见!
gcc - Using spinlocks with gcc
how can I use pthread_spinlock_t in gcc 4.6.3? Which flags do I have to specify at compile time? I'm using Ubuntu 12.04!
Thanks
deadlock - 小型嵌入式系统上 IRQ 中的自旋锁
我正在一个没有操作系统的 ARM 微控制器上开发一个小型嵌入式系统。它有几种不同类型的中断发生(按钮按下、A 到 D 转换、定时器等)并且只有一个线程在运行。
我想要一个 FIFO 事件队列来处理,其中每个中断服务例程将其事件添加到队列中,并且主(也是唯一的)线程从队列中删除要处理的事件。显然在中断服务例程中访问队列数据结构是危险的,但是自旋锁会导致死锁,因为如果主线程有锁并且发生中断,ISR 将永远等待锁。
当然,我已经知道我可以在主线程处理队列时禁用中断,但这并不理想。
在这里进行的最佳方式是什么?
谢谢
linux-kernel - 在 Uni 处理器(基于 ARM Cortex A8 的 SOC)上运行支持 SMP 的 Linux 内核是否有任何性能损失?
这是从我的微不足道的观察中提出的一个双重问题,即我在基于 ARM-Cortex 8 的 SoC 上运行支持 SMP 的 Linux。第一部分是关于 Uni 处理器系统上 SMP 和 NON-SMP Linux 内核之间的性能(内存空间/CPU 时间)差异。有什么区别吗?
第二部分是关于自旋锁的使用。在单处理器的情况下,AFAIK spinklock 是 noop。由于只有一个 CPU,并且(一次)只有一个进程在其上运行,因此没有其他进程用于忙循环。所以为了同步,我只需要禁用中断来保护我的关键部分。我的这种理解正确吗?
在此讨论中忽略驱动程序的可移植性因素。
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 内核?