免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2107 | 回复: 1

问个情景分析里的问题,进程管理部分,285页 [复制链接]

论坛徽章:
0
发表于 2007-04-11 16:41 |显示全部楼层
其中第二段开头说:“为什么要在597行把状态设成TASK_UNINTERRUPTIBLE呢?这是因为在get_pid()中产生一个新pid的操作必须是独占的,。。。。。。。”
下面付上文中提到的代码:
int do_fork(unsigned long clone_flags, unsigned long stack_start,
            struct pt_regs *regs, unsigned long stack_size)
{
        int retval = -ENOMEM;
        struct task_struct *p;
        DECLARE_MUTEX_LOCKED(sem);

        if (clone_flags & CLONE_PID) {
                /* This is only allowed from the boot up thread */
                if (current->pid)
                        return -EPERM;
        }
       
        current->vfork_sem = &sem;

        p = alloc_task_struct();
        if (!p)
                goto fork_out;

        *p = *current;

        retval = -EAGAIN;
        if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur)
                goto bad_fork_free;
        atomic_inc(&p->user->__count);
        atomic_inc(&p->user->processes);

        /*
         * Counter increases are protected by
         * the kernel lock so nr_threads can't
         * increase under us (but it may decrease).
         */
        if (nr_threads >= max_threads)
                goto bad_fork_cleanup_count;
       
        get_exec_domain(p->exec_domain);

        if (p->binfmt && p->binfmt->module)
                __MOD_INC_USE_COUNT(p->binfmt->module);

        p->did_exec = 0;
        p->swappable = 0;
        p->state = TASK_UNINTERRUPTIBLE;/*就是这里了。。。。。*/

        copy_flags(clone_flags, p);
        p->pid = get_pid(clone_flags);
        .....................
}

我觉得p->state = TASK_UNINTERRUPTIBLE仅设置了新分配的task_struct的state域,而目前新进程尚没挂入系统的进程队列中,不可能被调度,无论如何都不会被选中执行?那此处设置TASK_UNINTERUPTIBLE的意义到底是啥啊?

论坛徽章:
0
发表于 2007-04-12 14:49 |显示全部楼层

回复 #1 dengcainiao 的帖子

对于这个地方,我觉得情景分析的说法是有问题的。 在get_pid中使用了spin_lock,里面又用了read_lock,我看了看2.4.0的代码,实际上read_lock也是在循环,并没有睡眠,而且在spin_lock中睡眠是会造成死锁的。
     我的理解是:在获得pid之前最好把进程的状态设置成UNINTERRUPTIBLE, 如若不然,假如系统另外的某个地方在这个时候向刚刚获得的那个pid发送一个signal,会发生什么后果? 系统就有可能会对该进程调用wake_up,这个时候进程还没有准备好要运行。(当然这个信号可能在进程加入全局链表之后才有可能发送成功,但是总要有个时候设置进程的状态以避免这种情况,一种做法是在加入链表之前设置这个状态,另一种是在获得pid之前设置,第二种做法在逻辑上是很合理的,当然第一种做法应该也是可行的)

[ 本帖最后由 puppylove 于 2007-4-12 14:55 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP