问题标签 [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 回答
1134 浏览

ios7 - 当我使用 SpriteKit iOS7 编写游戏时,有没有人知道解决 OSSpinLockLock 问题?

OSSpinLockLock 是反复引起的,并且 lldb 没有为此显示适当的 callStackSymbols。

以下是我从 Xcode 版本 5.0.1 (5A2034a) 的 lldb 中得到的

我试图通过 [NSThread callStackSymbols] 获取更多符号,但在这种情况下无效。

这只发生在 SpriteKit (iOS7) 上。我已经在 SKEmitterNodes 周围检查了数十次,但它内部没有错误。奇怪的是,有时 copyWithZone: 消息在高速弹丸中无法正常运行,如下所示:

SKEmitterNode * template=[NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"cannonball_flame" ofType:@"sks"]]; .... ... [模板副本]; // --> 在某些情况下不好

有没有人知道解决这个问题?它是由 SpriteKit 错误引起的吗?

2013 年 11 月 2 日凌晨 1:31 调用堆栈 0

)

(lldb) bt all * thread #1: tid = 0xcf5af, 0x38ef1656 libsystem_platform.dylib spin_lock + 2, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x0) frame #0: 0x38ef1656 libsystem_platform.dylibspin_lock + 2 frame #1: 0x30c2d980 SpriteKit SKSpinLockSync(int*, void () block_pointer) + 92 frame #2: 0x30bf38fc SpriteKit-[SKTexture loadImageData] + 300 frame #3: 0x30bf67ee SpriteKit -[SKTexture size] + 42 frame #4: 0x30c163a4 SpriteKitSKCEmitterSprite::update(double) + 3136 frame #5: 0x30c262aa SpriteKit SKCSprite::update(double) + 354 frame #6: 0x30c262aa SpriteKitSKCSprite::update(double) + 354 帧 #7: 0x30c262aa SpriteKit SKCSprite::update(double) + 354 frame #8: 0x30beeb92 SpriteKit-[SKScene _update:] + 174 帧 #9: 0x30c03448 SpriteKit -[SKView(Private) _update:] + 324 frame #10: 0x30c00adc SpriteKit-[SKView renderCallback:] + 820 帧 #11: 0x30bfe51a SpriteKit __29-[SKView setUpRenderCallback]_block_invoke + 130 frame #12: 0x30c20c86 SpriteKit-[ SKDisplayLink callbackForNextFrame:] + 254 帧 #13: 0x002bb5fe libglInterpose.dylib -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 270 frame #14: 0x309dfad2 QuartzCoreCA::Display::DisplayLinkItem::dispatch() + 98 帧 #15: 0x309df87c QuartzCore CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 344 frame #16: 0x3360f76c IOMobileFramebufferIOMobileFramebufferVsyncNotifyFunc + 104 帧 #17: 0x2f266be4 IOKitIODispatchCalloutFromCFMessage + 248 frame #18: 0x2e544b80 CoreFoundation_CFMACHPORTPERFORM + 136帧#19:0x2E54F776核心__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 frame #20: 0x2e54f712 CoreFoundation控件__cfrunloopdosource1 + 346框架#21:0x2E54DEDE COREFOUNDECFRUNOOPRUNSPECIFIC __CFRunLoopRun + 1406 frame #22: 0x2e4b8470 CoreFoundation+ 524框架23:0x2E4B8252 COREFOUND AT2 AT2 AT2 AT2 AT2 ARG2 ARG2 ARGRIUK + iik + iik + iik @ indriik + iik CFRunLoopRunInMode + 106 frame #24: 0x331f22ea GraphicsServices@ influn + iik @ n.and inder + 30 UIApplicationMain + 1136 frame #26: 0x000e7258 NaughtyBirds. .m:18

线程 #5:tid = 0xcf5de,0x38e91550 libsystem_kernel.dylib __semwait_signal + 24, name = 'gputools.smt_poll.0x15d305b0 frame #0: 0x38e91550 libsystem_kernel.dylib__semwait_signal + 24 帧 #1:0x38e024ec libsystem_c.dylib 睡眠nanosleep + 172 frame #2: 0x38e0243c libsystem_c.dylib+ 52 帧 #3:0x00350ad0 GPUToolsCore smt_poll_thread_entry(void*) + 124 frame #4: 0x38ef7c5c libsystem_pthread.dylib_pthread_body + 140 帧 #5:0x38ef7bce libsystem_pthread.dylib`p`_p

线程 #7:tid = 0xcf5e0,0x38e7e838 libsystem_kernel.dylib kevent64 + 24, queue = 'com.apple.libdispatch-manager frame #0: 0x38e7e838 libsystem_kernel.dylibkevent64 + 24 帧 #1:0x38dcd0d4 libdispatch.dylib _dispatch_mgr_invoke + 232 frame #2: 0x38dc7622 libdispatch.dylib_dispatch_mgr_thread + 38

线程 #8: tid = 0xcf655, 0x38e91c7c libsystem_kernel.dylib __workq_kernreturn + 8 frame #0: 0x38e91c7c libsystem_kernel.dylib__workq_kernreturn + 8 帧 #1: 0x38ef5e0a libsystem_pthread.dylib`_pthread_wqthread + 310

线程 #9: tid = 0xcf664, 0x38e7ea84 libsystem_kernel.dylib mach_msg_trap + 20 frame #0: 0x38e7ea84 libsystem_kernel.dylibmach_msg_trap + 20 帧 #1: 0x38e7e880 libsystem_kernel.dylib mach_msg + 40 frame #2: 0x2df353c2 AudioToolboxAURemoteIO::IOThread::Run() + 106 帧 #3: 0x2df38600 AudioToolbox AURemoteIO::IOThread::Entry(void*) + 8 frame #4: 0x2de75772 AudioToolboxCAPThread::Entry(CAPThread*) + 210帧 #5:0x38ef7c5c libsystem_pthread.dylib _pthread_body + 140 frame #6: 0x38ef7bce libsystem_pthread.dylib_pthread_start + 102 (lldb)

0 投票
4 回答
5102 浏览

c++ - 在 Boost 中实现自旋锁。需要的例子

我想知道 boost 是否有任何库可以帮助实现自旋锁。我知道 boost 支持互斥锁,但我找不到任何显示或描述 boost 中的自旋锁的示例。任何显示如何使用 boost(最好)实现自旋锁的示例将不胜感激。(C++98)

0 投票
3 回答
1470 浏览

linux - Linux Kernel - Can I lock and unlock Spinlock in different functions?

I'm new to Kernel programming and programming with locks.

Is it safe to lock and unlock a spinlock in different functions? I am doing this to synchronize the code flow.

Also, is it safe to use spinlock (lock & unlock) in __schedule()? Is it safe to keep the scheduler waiting to acquire a lock?

Thanks in advance.

0 投票
2 回答
2038 浏览

php - APC User-Cache 适合高负载环境吗?

我们尝试在高负载环境中部署 APC 用户缓存作为我们的中央缓存服务 (redis) 的每台服务器上的本地第二层缓存,用于缓存几乎不更改结果的数据库查询和配置。我们基本上看看 Facebook 做了什么(几年前):

http://www.slideshare.net/guoqing75/4069180-caching-performance-lessons-from-facebook http://www.slideshare.net/shire/php-tek-2007-apc-facebook

它在一段时间内运行良好,但在高负载下几个小时后,APC 遇到问题,因此整个 mod_php 不再执行任何 PHP。即使是一个简单的 PHP 脚本也不再响应,而静态资源仍然由 Apache 提供。它并没有真正崩溃,没有段错误。我们尝试了最新的稳定版和最新的 APC 测试版,我们尝试了 pthreads、自旋锁,每次都遇到同样的问题。我们为 APC 提供了它可以消耗的更多内存,在崩溃前 1 分钟,我们有 2% 的碎片,大约 90% 的内存是空闲的。当它“崩溃”时,我们在错误日志中找不到任何东西,只有重新启动 Apache 会有所帮助。只有使用自旋锁,我们才会得到一个 php 错误,即:

PHP致命错误:未知:在第0行的未知中检测到卡住的自旋锁(0x7fcbae9fe068)

这似乎是一种超时,pthread 不会发生这种情况,因为它们不使用超时。

发生的事情可能是这样的:http: //notmysock.org/blog/php/user-cache-timebomb.html

一些数字:服务器每秒有大约 400 个 APC 用户缓存命中和大约 30 次插入(我认为这是很多),一个请求有大约 20-100 个用户缓存请求。用户缓存中大约有 300.000 个变量,所有变量都带有 ttl(我们只在中央 redis 中存储不带 ttl 的变量)。

我们的 APC 设置是:

目前我们使用的是用自旋锁编译的 3.1.13-beta 版本,与旧的 PHP 5.2.6 一起使用(这是一个遗留应用程序,我听说这个 PHP 版本也可能有问题?),Linux 64 位。

调试起来真的很困难,我们编写了监控脚本,这些脚本每分钟从 apc、系统等处收集尽可能多的数据,但我们看不到任何异常情况——即使在崩溃前 1 分钟也是如此。

我在这里看到了很多类似的问题,但是到目前为止我们还没有找到解决我们问题的解决方案。当我读到这样的东西时:

http://webadvent.org/2010/share-and-enjoy-by-gopal-vijayaraghavan

我不确定将 APC 用于本地用户缓存是否是高负载环境中的最佳选择。我们已经在这里使用过 memcached,但是 APC 要快得多。但是如何让它稳定呢?

最好的问候,安德烈亚斯

0 投票
0 回答
183 浏览

linux-kernel - linux内核中原子下面的上下文是什么?

上面的例子中提到的上下文是原子的吗?在这里,我们只是禁用中断而不是我猜的抢占。

0 投票
1 回答
1600 浏览

c++ - 微软的 OpenMP spinlock 时间如何控制?

英特尔编译器使用的 OpenMP 支持一个环境变量KMP_BLOCKTIMEdocs),我相信它控制线程等待新工作的忙等待(自旋锁定)时间(链接文档声称这默认为 200 毫秒)。

Gnu 编译器使用的 OpenMP 支持一个环境变量GOMP_SPINCOUNTdocs),我相信它也控制着该库的等效实现细节(尽管显然表示为迭代计数而不是时间)。

我的问题是:Microsoft 提供哪些控件(如果有)来控制 Microsoft 编译器使用的 OpenMP 中的此参数? (目前我感兴趣的是 VS2010。)

(我很清楚,如果我的程序的并行性完全基于 OpenMP,则几乎没有理由担心这一点,但我的兴趣是由来自大型复杂系统的一些 vtune 跟踪引起的,该系统也大量使用了 TBB。)

0 投票
4 回答
15573 浏览

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

最近在看Linux Kernel Development,有几个关于禁用抢占的问题。

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

    此外,禁用中断也会禁用内核抢占。

    我还从书中读到内核抢占可能发生在以下情况:

    当中断处理程序退出时,在返回内核空间之前。
    当内核代码再次变得可抢占时。
    如果内核中的任务显式调用 schedule()
    如果内核中的任务阻塞(这导致调用 schedule())

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

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

    帖子究竟什么是“自旋锁”? 说:

    在单核机器上,自旋锁只是“禁用中断”或“提高 IRQL”,它完全阻止线程调度。

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

0 投票
1 回答
1679 浏览

linux-device-driver - 锁(自旋锁等)和阻塞有什么区别

这可能看起来有点荒谬,但我很困惑。

  1. 锁定和阻塞操作之间到底有什么区别?
  2. 我们什么时候使用 Block,什么时候使用 Lock?
  3. 当我们可以使用自旋锁、信号量等使调用进程进入睡眠状态时(我想它会发生,如果我错了请指出)那么我们为什么要创建 wait_queues 来让进程进入睡眠状态(我希望这是阻塞)。

请回答。

0 投票
1 回答
548 浏览

linux - 如何解决SMP中的spinlock lockup,irq和function都想要锁?

我们的系统(linux)有一个 spin_lock 锁定/死锁问题,但我没有一个好主意来解决它。自旋锁可以在 irq 和数据传输功能中获得。锁定发生在:

  1. 该应用程序将传输数据,然后它通过 获取自旋锁spin_lock_irqsave,但没有调用spin_lock_irqrestore. 这将在 CPU1/CPU2/CPU3 中运行。

  2. 中断发生在CPU0,并试图通过调用获取相同的自旋锁spin_lock_irq_save,这导致系统锁定。因为对spin_lock_irqsave.

禁用 CPU0 irq 是一种解决方案,但是数据量很大,传输所有数据需要很长时间。而且一旦我们使用了 irq 亲和性,我们就必须禁用所有 CPU 中的所有 irq,这是不可接受的。

有没有其他方法可以解决这个问题?有什么经验吗?我猜内核应该已经有了解决这个问题的机制,但我不知道。

提前致谢!

0 投票
2 回答
697 浏览

c - 带自旋锁的计时器冻结

我正在使用内核模块中的计时器来处理 Debian 6,该计时器自动编程以从 jiffies 中获取 n 个“伪随机”数字并将它们插入循环缓冲区。当第 7 次触发 fire_timer(当 items_cbuf == 7 时)时,问题就出现了,当这种情况发生时,操作系统执行在该行中崩溃:

但以前不是,所以我不知道为什么会这样。任何提示?预期的工作方式是,当缓冲区达到其容量的 80% 时,整个内容将被转换为列表(即工作队列任务)

编辑:我已经把我的完整代码,人们可能在任何地方,我不想限制分辨率。我不确定,但相关函数应该是:install_module、Open_module、Fire_timer 和 release_module。我刚刚使用的确切用途是打开并等待十秒钟,然后我从 proc 条目中读取,但由于系统原因我无法读取,这会冻结

定义

[...]

[...]

这是我在系统冻结之前可以获得的代码:

内核错误

“睡觉,剩下6个是我的测试程序的消息,它的内容只是