问题标签 [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.

0 投票
1 回答
1354 浏览

device-driver - 设备驱动程序中的自旋锁

在设备驱动程序的情况下,任何人都可以解释自旋锁的确切用法。我很困惑,因为在我看到自旋锁的许多中断处理程序例程中。由于自旋锁正忙于等待。它可能会延迟其他中断。如果可能的话,请列出我们可以使用自旋锁的设备驱动程序的一些场景

我是这个领域的新手。你的帮助对我有一些初步的推动作用。

0 投票
3 回答
2552 浏览

multithreading - 线程数 = 硬件并行度时的互斥锁与自旋锁

考虑一个在专用服务器上运行的具有最佳线程数的程序,因此如果一个线程被锁定,则没有其他线程(几乎)在等待 CPU 时间。在这种情况下,在所有可能的情况下,自旋锁是否提供比互斥锁更好的性能?

[编辑] 一些解释:由于线程之间没有 CPU 时间争用,线程可以使用自旋锁,而不会对其他线程性能产生任何影响。并且自旋锁不会切换到可能足够重的等待模式(至少在 Windows 上,idk 它在 linux 上的执行方式)

0 投票
4 回答
27928 浏览

multithreading - x86 暂停指令如何在自旋锁中工作*并且*它可以在其他场景中使用吗?

pause指令常用于测试自旋锁的循环中,当其他线程拥有自旋锁时,以缓解紧密循环。据说相当于一些NOP指令。有人能告诉我它对自旋锁优化到底是如何工作的吗?在我看来,即使是 NOP 指令也是在浪费 CPU 时间。它们会降低 CPU 使用率吗?

另一个问题是我可以将暂停指令用于其他类似目的吗?例如,我有一个繁忙的线程,它不断扫描一些地方(例如队列)以检索新节点;但是,有时队列是空的,线程只是在浪费 CPU 时间。休眠线程并由其他线程唤醒它可能是一种选择,但是线程很关键,所以我不想让它休眠。

可以暂停指令工作以减轻 CPU 使用率吗?目前它使用物理核心的 100% cpu?

0 投票
1 回答
1370 浏览

x86 - Linux/SMP 自旋锁是不是太慢了?

通读Understanding the Linux kernel (Bovet & Cesati),内核同步一章后,自旋锁获取代码归结为:

现在我最初认为嵌套循环似乎很浪费,你可以实现类似的东西:

这会简单得多。但是,我明白他们为什么这样做了,因为它lock会影响其他 CPU,而且它们的时间btsl比简单的testb.

我无法理解的一件事是随后释放自旋锁。该书指出,它产生以下内容:

我的问题基本上是为什么?在我看来,lock/mov-immediate组合更快。

您不需要将旧状态设置为进位标志,因为遵循内核无错误的规则(假设在所述内核内部的许多其他地方),旧状态将为 1(您不会如果您还没有获得它,请尝试释放它)。

而且 amov比 a 快得多btrl,至少在 386 上是这样。

那么我错过了什么?

以后芯片上这些指令的时间是否发生了变化?

自从本书出版以来内核是否已更新?

这本书是完全错误的(或显示了简化的说明)吗?

我是否错过了一些其他方面,涉及更快的指令不满足的 CPU 之间的同步?

0 投票
2 回答
7795 浏览

linux-kernel - 禁用所有中断以保护多处理器系统上的 CPU 寄存器状态

我需要确保在代码部分(在内核模式下)没有其他人可以修改/检查 CR0 寄存器。在单处理器系统上,我认为禁用中断是最好的。但是在多处理器系统上:

  • 有没有办法在代码段期间禁用所有处理器的所有中断(例如使用自旋锁机制)?

  • 这是必要的吗?cr0在多处理器系统上修改寄存器时,我猜寄存器只针对当前CPU修改?--> 所以只为当前 CPU 禁用中断就足够了?--> 有没有办法从其他 CPU(在同一系统上)检查/修改来自另一个 CPU 的寄存器?

非常感谢您的回答(对不起我的近似英语)

杰罗姆。

0 投票
3 回答
2478 浏览

cpu - 什么时候使用自旋锁是个好主意?

似乎自旋锁并不是那么好,因为它们在等待(阻塞)时会浪费 CPU 周期。如果线程只是在等待唤醒信号时进入睡眠状态,那么 CPU 周期在旋转时不会丢失。

如果锁的持有时间很短,那么使用自旋锁可能会很好,那么它可能会使用更少的时间?如果这是真的,为什么?

0 投票
3 回答
3032 浏览

powerpc - 等效于 PPC 的 x86 PAUSE 指令

是否存在与 x86 PAUSE 指令等效的指令,它被放置在繁忙的等待循环中以提高性能,尤其是在 PowerPC 上的 SMT 机器上?

0 投票
1 回答
239 浏览

.net - .NET SpinLock 不释放 Thread.BeginCriticalSection

使用 .NET 反射器,我发现SpinLock结构在很多情况下调用Thread.BeginCriticalRegion而不调用Thread.EndCriticalRegion。例如,在公共函数 SpinLock.Enter(ref bool lockTaken) (.NET 4.0) 中:

在另一种情况下, SpinLock.Exit 似乎在没有调用Thread.BeginCriticalRegion的情况下调用了 Thread.EndCriticalRegion

所以问题是:不平衡对 Begin/EndCriticalRegion 的调用是否会出现任何问题?

0 投票
1 回答
517 浏览

pthreads - 有没有办法让 sem_wait 不旋转?

我目前正在开发一个跨平台的任务调度程序,但是我在等待信号量时遇到了 sem_wait 旋转的问题。在 Windows 上,我使用的是 WaitForSingleObject,它在等待时产生线程,这正是我想要的。但是 sem_wait 导致线程只是旋转,这是低效且不必要的。有没有办法让 sem_wait 产生线程而不是仅仅旋转?

谢谢

0 投票
8 回答
191444 浏览

synchronization - 什么时候应该使用自旋锁而不是互斥锁?

我认为两者都在做同样的工作,你如何决定使用哪一个进行同步?