DragonOS
DragonOS copied to clipboard
[BUG REPORT] 等待任意子进程退出时,发生死锁问题
描述错误 父进程调用sys_wait等待任意子进程退出时,如果释放了子进程的pid,那么会产生死锁
请填写您的电脑的信息:
- DragonOS版本:f5c732d
相关信息 https://bbs.dragonos.org.cn/t/topic/399/5
原因分析
下图154行获取了当前进程的children字段的读锁。
然后当162行释放pid时。如果子进程的parent是当前进程,并且子进程的pcb没有被其他地方再引用,那么就会调用子进程pcb的Drop方法.此时会尝试获取父进程的children字段的写锁,从而导致死锁。
可能的解决方案
- 延迟pcb被drop的时机(通过在do_wait这里存储多一个Arc指针,等children的读锁释放后,再drop掉指针。)
- 异步删除?建立通知机制,异步的从父进程的children字段里面删掉对应的pcb?
cc @val213 @sparkzky
我正在修复关于sys_wait4的问题