d的fork
我不确定我是否完全理解工作原理.我知道操作系统为两者创建只读内存页面
,如果要写入
内存节,操作系统复制页面
,在副本中写入,并且不会搞砸事情.
但接着问题是,如何标记内存为释放
?分叉进程不能因为,它写入副本,那么如何同步
呢?
GC
地址根是否在进程
间共享?或分叉
进程是否返回内存地址
给父进程?
是,GC
是否仅依赖于此?
分叉
进程运行时释放GC
操作,是否锁定?
如果GC.free()
在分叉进程按空闲
标记内存,但GC
立即再次使用
内存,然后收到通知
从分叉子进程
中释放时,会怎样?会?
它肯定会与父母沟通.我不确定是共享内存还是管道
机制.
返回
信息是哪些块
可按未引用
标记,然后在原始过程
中扫描.
参考
操作系统
创建进程
克隆.调用fork()
的原进程
叫父进程
,克隆
称为子进程
.
从调用fork
返回后,父进程
恢复正常,子进程
开始标记
阶段.
此时
两个进程的虚拟映射内存
是相同的.
如果任一进程
写入页面,操作系统复制
该页面并将更改
写入副本(写时复制).
因此,在子进程
当前收集
周期中,不考虑父进程
中已修改
页面.
标记
阶段结束后,子返回结果
给父,然后退出
.
因为只有标记
阶段才需要暂停
,剩下工作可由父进程
并行完成.
这是有效
的,因为在父级
中未引用的每一块
内存也在子级中也未引用
,因为除非要求分配
标记,它是不会
改变状态的克隆.
不必在父中做GC
相关的,可随意分配/释放
内存.
这不会干扰,因为子标记
了的块,被父视为正在使用
,但可收集未引用
的.
在子进程
返回结果给父进程
后,父进程
中的GC
线程就可完成收集周期
,就像自己完成了标记
一样.
调用fork()
后,剩下就算下个周期
了.
不要用强制转换
和其他
技巧存储
指针到非指针变量
中.
参考
void* p;
...
int x = cast(int)p;
//错误,未定义行为
垃圾收集器
不会扫描垃集
指针的非指针字段
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现