linux系统特殊进程简介——idle、init和kthreadd进程

1. 简介

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

2. idle进程

由系统自动创建, 运行在内核态
idle进程其pid=0,其前身是系统创建的第一个进程init_task,也是唯一一个没有通过fork或者kernel_thread产生的进程
init\init_task.c:

struct task_struct init_task = INIT_TASK(init_task);
EXPORT_SYMBOL(init_task);

3. init进程

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

kernel_thread(kernel_init, NULL, CLONE_FS);

init进程如果未定义execute_command,则尝试执行/sbin/init、/etc/init、/bin/init、/bin/sh文件

  if (execute_command) {
    ret = run_init_process(execute_command);
    if (!ret)
      return 0;
    panic("Requested init %s failed (error %d).",
          execute_command, ret);
  }
  if (!try_to_run_init_process("/sbin/init") ||
      !try_to_run_init_process("/etc/init") ||
      !try_to_run_init_process("/bin/init") ||
      !try_to_run_init_process("/bin/sh"))
    return 0;

4. kthreadd进程

kthreadd进程由idle进程创建,并始终运行在内核空间
负责所有内核线程的调度和管理其他内核线程, 会循环执行一个kthread的函数,该函数的作用就是运行kthread_create_list全局链表中维护的kthread, 当我们调用kernel_thread创建的内核线程会被加入到此链表中,因此所有的内核线程都是直接或者间接的以kthreadd为父进程

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

5. 总结

idle、init和kthreadd进程的关系

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值