d的fork

我不确定我是否完全理解工作原理.我知道操作系统为两者创建只读内存页面,如果要写入内存节,操作系统复制页面,在副本中写入,并且不会搞砸事情.
但接着问题是,如何标记内存为释放?分叉进程不能因为,它写入副本,那么如何同步呢?
GC地址根是否在进程间共享?或分叉进程是否返回内存地址给父进程?
是,GC是否仅依赖于此?
分叉进程运行时释放GC操作,是否锁定?

如果GC.free()在分叉进程按空闲标记内存,但GC立即再次使用内存,然后收到通知从分叉子进程中释放时,会怎样?会?

它肯定会与父母沟通.我不确定是共享内存还是管道机制.
返回信息是哪些块可按未引用标记,然后在原始过程中扫描.
参考

操作系统创建进程克隆.调用fork()原进程父进程,克隆称为子进程.
从调用fork返回后,父进程恢复正常,子进程开始标记阶段.
此时两个进程的虚拟映射内存是相同的.
如果任一进程写入页面,操作系统复制该页面并将更改写入副本(写时复制).

因此,在子进程当前收集周期中,不考虑父进程已修改页面.
标记阶段结束后,子返回结果给父,然后退出.
因为只有标记阶段才需要暂停,剩下工作可由父进程并行完成.
这是有效的,因为在父级中未引用的每一块内存也在子级中也未引用,因为除非要求分配标记,它是不会改变状态的克隆.
不必在父中做GC相关的,可随意分配/释放内存.
这不会干扰,因为子标记了的块,被父视为正在使用,但可收集未引用的.

子进程返回结果给父进程后,父进程中的GC线程就可完成收集周期,就像自己完成了标记一样.
调用fork()后,剩下就算下个周期了.

不要用强制转换其他技巧存储指针到非指针变量中.
参考

void* p;
...
int x = cast(int)p;
//错误,未定义行为

垃圾收集器不会扫描垃集指针的非指针字段.

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