我正在编写一个半精确的垃圾收集器,我想知道是否有办法准确检测给定线程的系统分配堆栈的边界。
我需要这个,所以我可以扫描堆栈中的根(指针),我当前的方法是在进入新线程时和进入main()时保存堆栈指针,然后再为每个线程保存它使用全局锁启动垃圾收集。
(我知道这种方法从长远来看并不理想,因为它会导致不必要的锁定,但是现在它基本可以接受了)
但我真的希望有一种更“安全”的方法来检测边界,因为root很容易“逃避”这种机制(取决于线程实现 - pthreads易于管理,但不是所以使用OpenMP或Grand Central Dispatch)。
如果有一种可移植的方式可以做到这一点会更棒,但我不希望如此。我目前正在研究Mac OS X 10.6,但欢迎任何平台的答案。
答案 0 :(得分:1)
您可以使用VM机制对堆栈的末尾进行写保护,并扩展VM写入陷阱。然后你就会知道堆栈页面中堆栈的边界。
但是我不确定我是否理解仅仅检查现有线程的SP当前值的异议, *如果你做出“大堆叠”假设* 通常由小的假设-number-of-threads并行社区。 p>
有关您没有“大筹码”的世界模型的讨论,请参阅this SO article。然后你不能构建一个只扫描“堆栈”的GC,因为它是按需分配的堆(例如,函数入口)。 现在您需要扫描可能存在的所有堆栈段。