诗和远方

idle(PID=0),init(PID=1)和kthreadd(PID=2)

Linux内核

init/main.c中的函数start_kernel就好像一般可执行程序中的主函数main,Linux系统进入start_kernel函数之前已经进行了一些最低限度的初始化,再往前研究就涉及很多硬件相关及汇编语言。从这里开始是较高层次的初始化,基本是C代码。

start_kernel函数是承前启后将前辈BIOS or Boot的棒接过来后,进行了完美的变身,因为这才是被称之为Linux的第一个函数。在这个函数后,所有Linux的特性进行完全展开。

在linux启动的C阶段start_kernel()的最后,rest_init()会开启两个进程:kernel_init,kthreadd,之后主线程变成idle线程,init/main.c。

linux下的3个特殊的进程:idle进程(PID=0),init进程(PID=1)和kthreadd(PID=2)。


* idle进程由系统自动创建, 运行在内核态   PID=0

idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变为进程调度、交换。


* init进程由idle通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终用户空间运行  PID=1 PPID=0

由0进程创建,完成系统的初始化. 是系统中所有其它用户进程的祖先进程 。

Linux中的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。在系统启动完成完成后,init将变为守护进程监视系统其他进程。


* kthreadd进程由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理 PID=2 PPID=0

它的任务就是管理和调度其他内核线程kernel_thread, 会循环执行一个kthreadd的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kthread_create创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程。所有的内核线程的PPID都是2。


注:所有的内核线程在大部分时间里都处于阻塞状态(TASK_INTERRUPTIBLE)只有在系统满足进程需要的某种资源的情况下才会运行。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Catalog
标签列表
最新
最热
常用网站
站点信息
  • 文章总数:2016
  • 页面总数:1
  • 分类总数:17
  • 标签总数:518
  • 评论总数:0
  • 浏览总数:592287
Archives
Copyright © 2017-2019 www.my889.com Some Rights Reserved.
推荐使用 Chrome 浏览器浏览本站
沪ICP备17052342号
Sitemap XML