Chinaunix

标题: sys_wait4中如何避免同thread_group中的两个task,并发回收同一个task [打印本页]

作者: motalelf    时间: 2007-10-09 15:20
标题: sys_wait4中如何避免同thread_group中的两个task,并发回收同一个task
以下讨论假设系统中暂时无TASK_STOPPED的进程 。



SMP中,thread_group中两个task分别为A,B。

B通过sys_fork产生子进程C,且子进程C已经sys_exit,为TASK_ZOMBIE。

A运行在CPUA上,执行系统调用sys_wait4( C的pid,null, null, null )。
B运行在CPUB上,执行系统调用sys_wait4( C的pid,null, __WNOTHREAD, null )。

那么情形如下:

1)CPUA在tasklist_lock中,遍历A的子进程未果,于是继续遍历B的子进程,得C,然后释放tasklist_lock,( 这里2并发),再然后释放C。

2)由于CPUA已经释放tasklist_lock,故CPUB在tasklist_lock中,遍历B的子进程,得C,然后释放tasklist_lock,再然后释放C。

这样,C被释放了两次??????
作者: puppylove    时间: 2007-10-09 15:20
标题: 回复 #3 motalelf 的帖子
hi,
     你说的是一个kernel的一个bug, 以前有人报告过。
      http://lkml.org/lkml/2001/11/6/138
     这些小bug的report总是被遗漏,所以好几个版本之后才被修正~~
作者: gta    时间: 2007-10-09 15:42
能说一下内核版本吗?
作者: motalelf    时间: 2007-10-09 16:02
.4.32
.4.35
作者: motalelf    时间: 2007-10-10 20:17
原帖由 puppylove 于 2007-10-9 15:20 发表
hi,


老大,能给个MSN之类的东西吗?

可能以后还有其他问题请教,不过不会很多,可以吗?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2