免费注册 查看新帖 |

Chinaunix

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

[进程管理] 内核线程migration_thread和kthreadd的创建 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-26 13:44 |只看该作者 |倒序浏览
内核中两大重要的线程,migration_thread负责cpu的负载均衡(将进程从本地队列移动到目标cpu的队列),kthreadd负责为kthread_create_list链表中的成员创建内核线程。

内核版本2.6.24中的引导部分,start_kernel()->rest_init():
static void noinline __init_refok rest_init(void)
        __releases(kernel_lock)
{
        int pid;

        kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
        numa_default_policy();
        pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
        kthreadd_task = find_task_by_pid(pid);
……
}
以上依次创建了kernel_init线程和kthreadd线程,rest_init()是在禁用抢占(preempt_disable)的情况下运行,因此保证了kernel_init()运行时kthreadd_task 已经指向ktheadd线程。

kernel_init()调用do_pre_smp_initcalls()->migration_init();创建了负责进程在cpu间移动(cpu负载均衡)的内核线程migration_thread,创建线程是通过将包含待运行函数及参数的kthread_create_info结构挂入kthread_create_list链表,然后唤醒kthreadd_task(即ktheadd线程),而ktheadd线程负责为链表上的每个结构创建相应的线程。
void __init migration_init(void)
{
        void *cpu = (void *)(long)smp_processor_id();
        int err;

        /* Start one for the boot CPU: */
        err = migration_call(&migration_notifier, CPU_UP_PREPARE, cpu);
……
}

static int __cpuinit
migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
{
        struct task_struct *p;
        int cpu = (long)hcpu;
        unsigned long flags;
        struct rq *rq;

        switch (action) {
        case CPU_LOCK_ACQUIRE:
                mutex_lock(&sched_hotcpu_mutex);
                break;

        case CPU_UP_PREPARE:
        case CPU_UP_PREPARE_FROZEN:
                p = kthread_create(migration_thread, hcpu, "migration/%d", cpu);
……
}

struct task_struct *kthread_create(int (*threadfn)(void *data),
                                   void *data,
                                   const char namefmt[],
                                   ...)
{
        struct kthread_create_info create;

        create.threadfn = threadfn;
        create.data = data;
        init_completion(&create.started);
        init_completion(&create.done);

        spin_lock(&kthread_create_lock);
        list_add_tail(&create.list, &kthread_create_list);
        wake_up_process(kthreadd_task);
……
}


论坛徽章:
1
金牛座
日期:2014-11-07 10:27:44
2 [报告]
发表于 2012-12-26 17:48 |只看该作者
顶顶~ 内核原理 还是应该用点心

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
3 [报告]
发表于 2012-12-27 12:19 |只看该作者
支持一下,这部分没看过,lz能不能再详细讲讲?

论坛徽章:
0
4 [报告]
发表于 2013-01-02 22:35 |只看该作者
本帖最后由 wangfeifeiwc 于 2013-01-02 23:26 编辑

kernel_threadδkernel_initkthreadd.
kthread_taskkthreaddkernel_thead.
smp
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP