d的fork
我不确定我是否完全理解工作原理.我知道操作系统为两者创建只读内存页面,如果要写入内存节,操作系统复制页面,在副本中写入,并且不会搞砸事情.
但接着问题是,如何标记内存为释放?分叉进程不能因为,它写入副本,那么如何同步呢?
GC地址根是否在进程间共享?或分叉进程是否返回内存地址给父进程?
是,GC是否仅依赖于此?
分叉进程运行时释放GC操作,是否锁定?
如果GC.free()在分叉进程按空闲标记内存,但GC立即再次使用内存,然后收到通知从分叉子进程中释放时,会怎样?会?
它肯定会与父母沟通.我不确定是共享内存还是管道机制.
返回信息是哪些块可按未引用标记,然后在原始过程中扫描.
参考
操作系统创建进程克隆.调用fork()的原进程叫父进程,克隆称为子进程.
从调用fork返回后,父进程恢复正常,子进程开始标记阶段.
此时两个进程的虚拟映射内存是相同的.
如果任一进程写入页面,操作系统复制该页面并将更改写入副本(写时复制).
因此,在子进程当前收集周期中,不考虑父进程中已修改页面.
标记阶段结束后,子返回结果给父,然后退出.
因为只有标记阶段才需要暂停,剩下工作可由父进程并行完成.
这是有效的,因为在父级中未引用的每一块内存也在子级中也未引用,因为除非要求分配标记,它是不会改变状态的克隆.
不必在父中做GC相关的,可随意分配/释放内存.
这不会干扰,因为子标记了的块,被父视为正在使用,但可收集未引用的.
在子进程返回结果给父进程后,父进程中的GC线程就可完成收集周期,就像自己完成了标记一样.
调用fork()后,剩下就算下个周期了.
不要用强制转换和其他技巧存储指针到非指针变量中.
参考
void* p;
...
int x = cast(int)p;
//错误,未定义行为
垃圾收集器不会扫描垃集指针的非指针字段.
浙公网安备 33010602011771号