memory-management - 自旋锁是内存分配器的好选择吗?

标签 memory-management concurrency garbage-collection mutex d

我已经多次向 D 编程语言运行时的维护者建议内存分配器/垃圾收集器应该使用自旋锁而不是常规的操作系统临界区。这还没有真正流行起来。以下是我认为自旋锁会更好的原因:

  • 至少在我所做的综合基准测试中,当内存分配器/GC 锁存在争用时,它比操作系统关键部分快几倍。编辑:根据经验,在单核环境中使用自旋锁甚至没有可测量的开销,可能是因为锁需要在内存分配器中保持这么短的时间。
  • 内存分配和类似操作通常只占用时间片的一小部分,甚至只占用上下文切换时间的一小部分,这使得在争用的情况下进行上下文切换很愚蠢。
  • 有问题的实现中的垃圾收集无论如何都会停止世界。收集期间不会有任何旋转。

  • 有什么好的理由不是 在内存分配器/垃圾收集器实现中使用自旋锁?

    最佳答案

  • 显然,自旋锁的最坏情况是很糟糕的(操作系统调度程序只看到 30 个受 CPU 限制的线程,所以它试图给它们所有的 CPU 时间;当持有锁的线程休眠时,其中 29 个像疯了似的自旋),所以如果可以的话,你应该避免它们。很多比我聪明的人声称自旋锁没有用户空间用例,因此。
  • 系统互斥锁应该在线程进入休眠状态(或确实进行任何类型的系统调用)之前旋转一点,因此即使存在一些争用,它们有时也可以与自旋锁完全相同。
  • 分配器通常可以通过仅使用锁将页面分配给线程来实际消除锁争用。然后每个线程负责对自己的页面进行分区。您最终每 N 次分配只获得一次锁,并且您可以将 N 配置为您喜欢的任何值。

  • 我认为 2 和 3 是强有力的论据,不能被综合基准有效地反驳。您需要证明实际程序的性能会受到影响。

    关于memory-management - 自旋锁是内存分配器的好选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1910633/

    相关文章:

    java - 单例 Bean 如何服务并发请求?

    java - java.util.concurrent.Future 不一致?

    language-agnostic - 并发和并行有什么区别?

    java - 超过 12GB 时将忽略最大堆大小

    C# GC 委托(delegate)?

    java - 编程问题-抛硬币

    c - 为什么 malloc(0) 在 Windows 中返回一个非空地址?

    c - 如何在 C 中以可移植的方式管理内存对齐和通用指针算术?

    c# - 垃圾收集器无法为主要堆部分分配 16384 字节的内存

    c++ - 删除指向派生对象的基指针