d改进垃集的可能方向

原文
也许,D的GC应该正式公开一个互斥锁,当它运行时,你可同步它.所以可在JNI桥或其他地方合作.可能值得考虑.听说C#类似.
GC停止线程原因是,确保分析过程中不变化.
如,GC扫描0-1000地址时,没有发现,然后运行中的线程引用一个2200内存地址下移800地址,而GC正在扫描1000-2000地址.
然后GC扫描2000-3000,对象曾经在那里,但现在不丰.GC不知道它需要再次扫描800地址.它从未见过该对象,认为该对象死了,并释放了它.
然后,线程使用对象,并崩溃.
当前实现通过停止所有线程来避免.
但是,停止一切需要:
1)GC知道有哪些线程,并停止它们.
2)这是大材小用!真正要做的是,像示例那样,在运行时阻止可能改变GC分析的操作.不需要停止数值工作,它不会改变GC.不必停止读取指针(有些确实需要停止),所以也不必停止它们.

由于GC关心的是指针位置,因此可用叫写障的东西专门勾挂它;或阻塞指针写入,或至少通知GC(.顺便,不必阻塞所有写入指针,只阻塞不同内存块的写指针.所以可继续切片迭代等.更多细节).
那么接着:
GC扫描0-1000地址,未发现内容.
然后运行中的线程引用从2200内存地址下移到800地址.然后触发写障.在GC完成之前,禁止线程完成该操作.注意GC不必提前知道该线程,因为由运行中线程负责传达意图给GC.(GC持有互斥锁,在生成D代码中,在该互斥锁上,要求同步所有指针写入,但实现方式多种多样.)
然后GC扫描2000-3000,对象仍在那里,因为暂停写了!它没有释放它.
GC完成了它的工作,释放了写碍.现在恢复线程并移动,对象仍然活着,没有崩溃.
这将是并发GC,不会停止正在执行自包含工作的线程,也将与外部线程更兼容,因为无论是什么线程,它都要使用gc互斥锁屏障.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示