coo*_*kid 5 c++ concurrency multithreading garbage-collection memory-management
我正在用C++创建并发内存回收算法.需要定期检查执行mutator线程的堆栈,以便我可以看到线程当前持有的引用.在执行此操作的过程中,我还需要检查mutator线程的寄存器以检查可能存在于其中的任何引用.
很明显,许多JVM和C#vm在执行此操作时都没有问题,因为它们是垃圾收集周期的一部分.但是,我无法找到解决此问题的最终解决方案.
我不能完全分开Bohem垃圾收集器中发生的事情,以便检查根集,如果可以(或知道它是如何完成的),我真的很想知道.
理想情况下,我可以使mutator线程被中断,并执行一段处理程序代码,该代码将报告它的PC并将任何基于寄存器的引用刷新到堆栈中,然后可能有助于完成收集周期.我相信大多数系统中的大多数编译器会在调用中断或信号处理程序时自动刷新寄存器,但我不清楚具体细节或如何访问该数据.似乎单独的堆栈可能用于中断和信号处理程序.此外,我找不到有关如何定位特定线程或如何发送信号的任何信息.Windows无论如何似乎都不支持这种形式的信令,我希望我的系统能够在x86-64处理器上的Linux和Windows上运行.
编辑: SuspendThread()在某些情况下使用,虽然安全点似乎是首选.有什么想法吗?有没有办法处理持久的I/O等待或其他等待内核代码返回?
我觉得这是一个非常有趣的问题,所以我深入研究了一下。事实证明,Hotspot JVM 使用了一种称为“安全点”的机制,该机制会导致 JVM 的线程协同全部停止,以便 GC 可以开始。换句话说,发起GC的线程并不会强行停止其他线程,其他线程会通过各种巧妙的机制自愿挂起自己。
我不相信 JVM 会扫描寄存器,因为安全点的定义使得所有根都是已知的(我认为这意味着在内存中)。
欲了解更多信息,请参阅:
关于您想要“中断”所有线程的愿望,根据我上面引用的幻灯片,线程挂起“在 Solaris 和 Linux 上不可靠,例如虚假信号”。我不确定幻灯片所指的线程悬挂机制是什么。
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |