检测当前线程的堆栈边界

时间:2010-01-25 20:24:39

标签: multithreading garbage-collection parallel-processing

我正在编写一个半精确的垃圾收集器,我想知道是否有办法准确检测给定线程的系统分配堆栈的边界。

我需要这个,所以我可以扫描堆栈中的根(指针),我当前的方法是在进入新线程时和进入main()时保存堆栈指针,然后再为每个线程保存它使用全局锁启动垃圾收集。

(我知道这种方法从长远来看并不理想,因为它会导致不必要的锁定,但是现在它基本可以接受了)

但我真的希望有一种更“安全”的方法来检测边界,因为root很容易“逃避”这种机制(取决于线程实现 - pthreads易于管理,但不是所以使用OpenMP或Grand Central Dispatch)。

如果有一种可移植的方式可以做到这一点会更棒,但我不希望如此。我目前正在研究Mac OS X 10.6,但欢迎任何平台的答案。

1 个答案:

答案 0 :(得分:1)

您可以使用VM机制对堆栈的末尾进行写保护,并扩展VM写入陷阱。然后你就会知道堆栈页面中堆栈的边界。

但是我不确定我是否理解仅仅检查现有线程的SP当前值的异议, *如果你做出“大堆叠”假设* 通常由小的假设-number-of-threads并行社区。

有关您没有“大筹码”的世界模型的讨论,请参阅this SO article。然后你不能构建一个只扫描“堆栈”的GC,因为它是按需分配的堆(例如,函数入口)。 现在您需要扫描可能存在的所有堆栈段。