From e110daa18ec9e30597e9ddeb09b4128624ca5422 Mon Sep 17 00:00:00 2001 From: gatieme Date: Thu, 19 May 2016 14:57:29 +0800 Subject: [PATCH] ... --- study/kernel/process/create/01-idel/README.md | 231 +++++++++++++++--- .../process/create/01-idel/images/ps-aux.jpg | Bin 0 -> 36041 bytes 2 files changed, 198 insertions(+), 33 deletions(-) create mode 100644 study/kernel/process/create/01-idel/images/ps-aux.jpg diff --git a/study/kernel/process/create/01-idel/README.md b/study/kernel/process/create/01-idel/README.md index 456e9d7..a83eb02 100644 --- a/study/kernel/process/create/01-idel/README.md +++ b/study/kernel/process/create/01-idel/README.md @@ -1,31 +1,40 @@ -Linux下0号进程idel +Linux下0号进程idle ======= | 日期 | 内核版本 | 架构| 作者 | GitHub| CSDN | | ------------- |:-------------:|:-------------:|:-------------:|:-------------:|:-------------:| | 2016-05-12 | [Linux-4.5](http://lxr.free-electrons.com/source/?v=4.5) | X86 & arm | [gatieme](http://blog.csdn.net/gatieme) | [LinuxDeviceDrivers](https://github.com/gatieme/LDD-LinuxDeviceDrivers) | [Linux-进程管理与调度](http://blog.csdn.net/gatieme/article/category/6225543) | +\ - -#0号进程idel -------- - - -Linux下有两个特殊的进程,idel进程($PID = 0$)和init进程($PID = 1$) +Linux下有3个特殊的进程,idle进程($PID = 0$), init进程($PID = 1$)和kthreadd($PID = 2$) -* idel进程由系统自动创建, 运行在内核态 +* idle进程由系统自动创建, 运行在内核态 - idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。完成加载系统后,演变为进程调度、交换 + idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变为进程调度、交换 -* init进程由idel创建, +* init进程由idle通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终用户空间 由0进程创建,完成系统的初始化. 是系统中所有其它用户进程的祖先进程 Linux中的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。在系统启动完成完成后,init将变为守护进程监视系统其他进程。 + + + +* kthreadd进程由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理 + 它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthread的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程 + + + + + + + + 系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型。整个linux系统的所有进程也是一个树形结构。**树根是系统自动构造的(或者说是由内核黑客手动创建的)**,即在内核态下执行的0号进程,它是所有进程的远古先祖。 @@ -34,7 +43,7 @@ Linux下0号进程idel -#idel的创建 +#idle的创建 ------- 在smp系统中,每个处理器单元有独立的一个运行队列,而每个运行队列上又有一个idle进程,即有多少处理器单元,就有多少idle进程。 @@ -44,7 +53,9 @@ Linux下0号进程idel 我们知道系统是从BIOS加电自检,载入MBR中的引导程序(LILO/GRUB),再加载linux内核开始运行的,一直到指定shell开始运行告一段落,这时用户开始操作Linux。 -#0号进程上下文信息--init_task描述符 + + +##0号进程上下文信息--init_task描述符 ------- @@ -52,16 +63,23 @@ Linux下0号进程idel * **内核init线程**,最终执行/sbin/init进程,变为所有用户态程序的根进程(pstree命令显示),即用户空间的init进程 + 开始的init是有kthread_thread创建的内核线程, 他在完成初始化工作后, 转向用户空间, 并且生成所有用户进程的祖先 + * **内核kthreadd内核线程**,变为所有内核态其他守护线程的父线程。 -所以**init_task决定了系统所有进程、线程的基因, 它完成初始化后, 最终演变为0号进程idel, 并且运行在内核态** + 它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthread的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程 + + +![pa-aux](./images/ps-aux.jpg) + + +所以**init_task决定了系统所有进程、线程的基因, 它完成初始化后, 最终演变为0号进程idle, 并且运行在内核态** 内核在初始化过程中,当创建完init和kthreadd内核线程后,内核会发生调度执行,此时内核将使用该init_task作为其task_struct结构体描述符,当系统无事可做时,会调度其执行, 此时该内核会变为idle进程,让出CPU,自己进入睡眠,不停的循环,查看init_task结构体,其comm字段为swapper,作为idle进程的描述符。 ->0号线程idel的优先级为120,从#define INIT_TASK(tsk)中可以看出。 +>idle的运行时机 > ->这也就决定了,其优先级足够低, 以保证其他用户进程或者系统线程会被优先调度 - +>idle 进程优先级为MAX_PRIO-20。早先版本中,idle是参与调度的,所以将其优先级设低点,当没有其他进程可以运行时,才会调度执行 idle。而目前的版本中idle并不在运行队列中参与调度,而是在运行队列结构中含idle指针,指向idle进程,在调度器发现运行队列为空的时候运行,调入运行 简言之, **内核中init_task变量就是是进程0使用的进程描述符**,也是Linux系统中第一个进程描述符,init_task并不是系统通过kernel_thread的方式(当然更不可能是fork)创建的, 而是由内核黑客静态创建的. @@ -85,7 +103,7 @@ init_task是Linux内核中的第一个线程,它贯穿于整个Linux系统的 >备注:core0上的idle进程由init_task进程退化而来,而AP的idle进程则是BSP在后面调用fork()函数逐个创建的 -##进程堆栈init_thread_union +###进程堆栈init_thread_union ------- init_task进程使用init_thread_union数据结构描述的内存区域作为该进程的堆栈空间,并且和自身的thread_info参数公用这一内存空间空间, @@ -145,9 +163,23 @@ cat System.map-3.1.6 | grep init_thread_union ![init_thread_union](./images/init_thread_union.png) -#进程内存空间 +###进程内存空间 ------- +init_task的虚拟地址空间,也采用同样的方法被定义 + +由于init_task是一个运行在内核空间的内核线程, 因此其虚地址段mm为NULL, 但是必要时他还是需要使用虚拟地址的,因此avtive_mm被设置为init_mm + +> 参见 +> +> http://lxr.free-electrons.com/source/include/linux/init_task.h?v=4.5#L202 + +```c +.mm = NULL, \ + .active_mm = &init_mm, \ ``` +其中init_mm被定义为init-mm.c中,参见 http://lxr.free-electrons.com/source/mm/init-mm.c?v=4.5#L16 + +```c struct mm_struct init_mm = { .mm_rb = RB_ROOT, .pgd = swapper_pg_dir, @@ -160,8 +192,10 @@ struct mm_struct init_mm = { }; ``` +#0号进程的演化 +------- -#rest_init +##rest_init创建init进程(PID =1)和kthread进程(PID=2) ------- Linux在无进程概念的情况下将一直从初始化部分的代码执行到start_kernel,然后再到其最后一个函数调用rest_init @@ -220,7 +254,7 @@ static noinline void __init_refok rest_init(void) 5. 调用cpu_idle(),0号线程进入idle函数的循环,在该循环中会周期性地检查。 -##创建kernel_init +###创建kernel_init ------- 在rest_init函数中,内核将通过下面的代码产生第一个真正的进程(pid=1): @@ -239,7 +273,7 @@ kernel_thread(kernel_init, NULL, CLONE_FS); 关于init其他的信息我们这次先不研究,因为我们这篇旨在探究0号进程的详细过程, -##创建kthreadd +###创建kthreadd ------- 在rest_init函数中,内核将通过下面的代码产生第一个kthreadd(pid=2) @@ -247,8 +281,10 @@ kernel_thread(kernel_init, NULL, CLONE_FS); pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); ``` +它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthread的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程 -##0号进程演变为idel + +##0号进程演变为idle ------- ```c @@ -321,30 +357,120 @@ cpu_startup_entry定义在[kernel/sched/idle.c](http://lxr.free-electrons.com/so } ``` -其中cpu_idel_loop就是idel进程的事件循环,定义在[kernel/sched/idle.c](http://lxr.free-electrons.com/source/kernel/sched/idle.c?v=4.5#L203) +其中cpu_idle_loop就是idle进程的事件循环,定义在[kernel/sched/idle.c](http://lxr.free-electrons.com/source/kernel/sched/idle.c?v=4.5#L203) + + 整个过程简单的说就是,原始进程(pid=0)创建init进程(pid=1),然后演化成idle进程(pid=0)。init进程为每个从处理器(运行队列)创建出一个idle进程(pid=0),然后演化成/sbin/init。 -  3. idle的运行时机 -  idle 进程优先级为MAX_PRIO,即最低优先级。早先版本中,idle是参与调度的,所以将其优先级设为最低,当没有其他进程可以运行时,才会调度执行 idle。而目前的版本中idle并不在运行队列中参与调度,而是在运行队列结构中含idle指针,指向idle进程,在调度器发现运行队列为空的时候运行,调入运行。 +#idle的运行与调度 +------- -  4. idle的workload -  从上面的分析我们可以看出,idle在系统没有其他就绪的进程可执行的时候才会被调度。不管是主处理器,还是从处理器,最后都是执行的cpu_idle()函数。所以我们来看看cpu_idle做了什么事情。 +##idle的workload--cpu_idle_loop +------- -  因为idle进程中并不执行什么有意义的任务,所以通常考虑的是两点:1.节能,2.低退出延迟。 +从上面的分析我们知道,idle在系统没有其他就绪的进程可执行的时候才会被调度。不管是主处理器,还是从处理器,最后都是执行的cpu_idle_loop()函数 -  其核心代码如下: +其中cpu_idle_loop就是idle进程的事件循环,定义在[kernel/sched/idle.c](http://lxr.free-electrons.com/source/kernel/sched/idle.c?v=4.5#L203),早期的版本中提供的是[cpu_idle](http://lxr.free-electrons.com/ident?v=3.9;i=cpu_idle),但是这个函数是完全依赖于体系结构的,不利用架构的分层,因此在新的内核中更新为更加通用的cpu_idle_loop,由他来调用体系结构相关的代码 -  void cpu_idle(void) { int cpu = smp_processor_id(); current_thread_info()->status |= TS_POLLING; /* endless idle loop with no priority at all */ while (1) { tick_nohz_stop_sched_tick(1); while (!need_resched()) { check_pgt_cache(); rmb(); if (rcu_pending(cpu)) rcu_check_callbacks(cpu, 0); if (cpu_is_offline(cpu)) play_dead(); local_irq_disable(); __get_cpu_var(irq_stat).idle_timestamp = jiffies; /* Don't trace irqs off for idle */ stop_critical_timings(); pm_idle(); start_critical_timings(); } tick_nohz_restart_sched_tick(); preempt_enable_no_resched(); schedule(); preempt_disable(); } } +所以我们来看看cpu_idle_loop做了什么事情。 -  循环判断need_resched以降低退出延迟,用idle()来节能。 +因为idle进程中并不执行什么有意义的任务,所以通常考虑的是两点 + +1. 节能 + +2. 低退出延迟。 + +其代码如下 + +```c +/* + * Generic idle loop implementation + * + * Called with polling cleared. + */ +static void cpu_idle_loop(void) +{ + while (1) { + /* + * If the arch has a polling bit, we maintain an invariant: + * + * Our polling bit is clear if we're not scheduled (i.e. if + * rq->curr != rq->idle). This means that, if rq->idle has + * the polling bit set, then setting need_resched is + * guaranteed to cause the cpu to reschedule. + */ + + __current_set_polling(); + quiet_vmstat(); + tick_nohz_idle_enter(); + + while (!need_resched()) { + check_pgt_cache(); + rmb(); + + if (cpu_is_offline(smp_processor_id())) { + rcu_cpu_notify(NULL, CPU_DYING_IDLE, + (void *)(long)smp_processor_id()); + smp_mb(); /* all activity before dead. */ + this_cpu_write(cpu_dead_idle, true); + arch_cpu_idle_dead(); + } + + local_irq_disable(); + arch_cpu_idle_enter(); + + /* + * In poll mode we reenable interrupts and spin. + * + * Also if we detected in the wakeup from idle + * path that the tick broadcast device expired + * for us, we don't want to go deep idle as we + * know that the IPI is going to arrive right + * away + */ + if (cpu_idle_force_poll || tick_check_broadcast_expired()) + cpu_idle_poll(); + else + cpuidle_idle_call(); + + arch_cpu_idle_exit(); + } + + /* + * Since we fell out of the loop above, we know + * TIF_NEED_RESCHED must be set, propagate it into + * PREEMPT_NEED_RESCHED. + * + * This is required because for polling idle loops we will + * not have had an IPI to fold the state for us. + */ + preempt_set_need_resched(); + tick_nohz_idle_exit(); + __current_clr_polling(); + + /* + * We promise to call sched_ttwu_pending and reschedule + * if need_resched is set while polling is set. That + * means that clearing polling needs to be visible + * before doing these things. + */ + smp_mb__after_atomic(); + + sched_ttwu_pending(); + schedule_preempt_disabled(); + } +} +``` + +循环判断need_resched以降低退出延迟,用idle()来节能。 + +默认的idle实现是hlt指令,hlt指令使CPU处于暂停状态,等待硬件中断发生的时候恢复,从而达到节能的目的。即从处理器C0态变到 C1态(见 ACPI标准)。这也是早些年windows平台上各种"处理器降温"工具的主要手段。当然idle也可以是在别的ACPI或者APM模块中定义的,甚至是自定义的一个idle(比如说nop)。 -  默认的idle实现是hlt指令,hlt指令使CPU处于暂停状态,等待硬件中断发生的时候恢复,从而达到节能的目的。即从处理器C0态变到 C1态(见 ACPI标准)。这也是早些年windows平台上各种"处理器降温"工具的主要手段。当然idle也可以是在别的ACPI或者APM模块中定义的,甚至是自定义的一个idle(比如说nop)。 -  小结:   1.idle是一个进程,其pid为0。 @@ -356,3 +482,42 @@ cpu_startup_entry定义在[kernel/sched/idle.c](http://lxr.free-electrons.com/so   希望通过本文你能全面了解linux内核中idle知识。 +##idle的调度和运行时机 +------- + +我们知道, linux进程的调度顺序是按照 rt实时进程(rt调度器), normal普通进程(cfs调度器),和idel的顺序来调度的 + +那么可以试想如果rt和cfs都没有可以运行的任务,那么idle才可以被调度,那么他是通过怎样的方式实现的呢? + + +由于我们还没有讲解调度器的知识, 所有我们只是简单讲解一下 + +在normal的调度类,cfs公平调度器[sched_fair.c](http://lxr.free-electrons.com/source/kernel/sched/fair.c?v=4.5#L8408)中, 我们可以看到 + +```c +static const struct sched_class fair_sched_class = { +.next = &idle_sched_class, +``` +也就是说,如果系统中没有普通进程,那么会选择下个调度类优先级的进程,即使用idle_sched_class调度类进行调度的进程 + +当系统空闲的时候,最后就是调用idle的pick_next_task函数,被定义在/kernel/sched/idle_task.c中 + +>参见 +> +>http://lxr.free-electrons.com/source/kernel/sched/idle_task.c?v=4.5#L27 + +```c +static struct task_struct *pick_next_task_idle(struct rq *rq) +{ + schedstat_inc(rq, sched_goidle); + calc_load_account_idle(rq); + return rq->idle; //可以看到就是返回rq中idle进程。 +} +``` + +这idle进程在启动start_kernel函数的时候调用init_idle函数的时候,把当前进程(0号进程)置为每个rq运行队列的的idle上。 +``` +rq->curr = rq->idle = idle; +``` +这里idle就是调用start_kernel函数的进程,就是0号进程。 + diff --git a/study/kernel/process/create/01-idel/images/ps-aux.jpg b/study/kernel/process/create/01-idel/images/ps-aux.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57db7cc0d9d1a83797f1d6366bf2edb9c04b88f0 GIT binary patch literal 36041 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 literal 0 HcmV?d00001