免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3055 | 回复: 1
打印 上一主题 下一主题

shedule()中context_switch 的疑惑? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-11 20:20 |只看该作者 |倒序浏览
3549:        if (likely(prev != next)) {
                next->timestamp = next->last_ran = now;
                rq->nr_switches++;
                rq->curr = next;
                ++*switch_count;

                prepare_task_switch(rq, next);
                prev = context_switch(rq, prev, next);                barrier();
                /*
                 * this_rq must be evaluated again because prev may have moved
                 * CPUs since it called schedule(), thus the 'rq' on its stack
                 * frame will be invalid.
                 */
                finish_task_switch(this_rq(), prev);
        } else
                spin_unlock_irq(&rq->lock);

        prev = current;
        if (unlikely(reacquire_kernel_lock(prev) < 0))
                goto need_resched_nonpreemptible;
        preempt_enable_no_resched();
        if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
                goto need_resched;
}
以上代码为内核schedule()中的源代码 从3549行开始。
我的疑惑为红色代码中的context_switch 函数.
我的理解为这个函数负责进程上下文的切换。
调用这个函数之后应该就不会立即返回。因为进程的上下文已经变化了。也就是说barrier();暂时得不到执行 除非又换回
context_switch以前的上下文。这样才会执行。。。
照这个思路下去  只有shedule()才能进行上下文的切换。这样的话 内核不就是在递归的调用schedule()吗?

思路是不是有点不对? 往大家指正~

[ 本帖最后由 ring8595 于 2008-12-11 20:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-11 22:45 |只看该作者
当下次schedule()调度到此程序执行时,将进行堆栈的切换,这儿就相当于是这个进程从schedule()的返回。进程切换中堆栈切换是主要,代码实现的很妙
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP