Linux下有3个特殊的进程,idle进程(),init进程()和kthreadd()

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

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

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为父进程

我们下面就详解分析1号进程的前世(kernel_init)今生(init进程)

Linux系统中的init进程(pid=1)是除了idle进程(pid=0,也就是init_task)之外另一个比较特殊的进程,它是Linux内核开始建立起进程概念时第一个通过kernel_thread产生的进程,其开始在内核态执行,然后通过一个系统调用,开始执行用户空间的/sbin/init程序,期间Linux内核也经历了从内核态到用户态的特权级转变,/sbin/init极有可能产生出了shell,然后所有的用户进程都有该进程派生出来

1号进程

前面我们了解到了0号进程是系统所有进程的先祖, 它的进程描述符init_task是内核静态创建的, 而它在进行初始化的时候, 通过kernel_thread的方式创建了两个内核线程,分别是kernel_init和kthreadd,其中kernel_init进程号为1

start_kernel在其最后一个函数rest_init的调用中,会通过kernel_thread来生成一个内核进程,后者则会在新进程环境下调用kernel_init函数,kernel_init一个让人感兴趣的地方在于它会调用run_init_process来执行根文件系统下的 /sbin/init等程序。

kernel_init

0号进程创建1号进程的方式如下

kernel_thread(kernel_init, NULL, CLONE_FS);

我们发现1号进程的执行函数就是kernel_init, 这个函数被定义init/main.c中,如下所示

kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程。

由0号进程创建1号进程(内核态),1号内核线程负责执行内核的部分初始化工作及进行系统配置,并创建若干个用于高速缓存和虚拟主存管理的内核线程。

init进程

随后,1号进程调用do_execve运行可执行程序init,并演变成用户态1号进程,即init进程。

init进程是linux内核启动的第一个用户级进程。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。

它按照配置文件/etc/initab的要求,完成系统启动工作,创建编号为1号、2号…的若干终端注册进程getty。

每个getty进程设置其进程组标识号,并监视配置到系统终端的接口线路。当检测到来自终端的连接信号时,getty进程将通过函数do_execve()执行注册程序login,此时用户就可输入注册名和密码进入登录过程,如果成功,由login程序再通过函数execv()执行shell,该shell进程接收getty进程的pid,取代原来的getty进程。再由shell直接或间接地产生其他进程。

上述过程可描述为:0号进程->1号内核进程->1号用户进程(init进程)->getty进程->shell进程

注意,上述过程描述中提到:1号内核进程调用执行init函数并演变成1号用户态进程(init进程),这里前者是init是函数,后者是进程。两者容易混淆,区别如下:

  1. kernel_init函数在内核态运行,是内核代码
  2. init进程是内核启动并运行的第一个用户进程,运行在用户态下。
  3. 一号内核进程调用execve()从文件/etc/inittab中加载可执行程序init并执行,这个过程并没有使用调用do_fork(),因此两个进程都是1号进程。

当内核启动了自己之后(已被装入内存、已经开始运行、已经初始化了所有的设备驱动程序和数据结构等等),通过启动用户级程序init来完成引导进程的内核部分。因此,init总是第一个进程(它的进程号总是1)。

当init开始运行,它通过执行一些管理任务来结束引导进程,例如检查文件系统、清理/tmp、启动各种服务以及为每个终端和虚拟控制台启动getty,在这些地方用户将登录系统。

在系统完全起来之后,init为每个用户已退出的终端重启getty(这样下一个用户就可以登录)。init同样也收集孤立的进程:当一个进程启动了一个子进程并且在子进程之前终止了,这个子进程立刻成为init的子进程。对于各种技术方面的原因来说这是很重要的,知道这些也是有好处的,因为这便于理解进程列表和进程树图。init的变种很少。绝大多数Linux发行版本使用sysinit(由Miguel van Smoorenburg著),它是基于System V的init设计。UNIX的BSD版本有一个不同的init。最主要的不同在于运行级别:System V有而BSD没有(至少是传统上说)。这种区别并不是主要的。在此我们仅讨论sysvinit。 配置init以启动getty:/etc/inittab文件

关于init程序

1号进程通过execve执行init程序来进入用户空间,成为init进程,那么这个init在哪里呢

内核在几个位置上来查寻init,这几个位置以前常用来放置init,但是init的最适当的位置(在Linux系统上)是/sbin/init。如果内核没有找到init,它就会试着运行/bin/sh,如果还是失败了,那么系统的启动就宣告失败了。

因此init程序是一个可以又用户编写的进程, 如果希望看init程序源码的朋友,可以参见

Ubuntu等使用deb包的系统可以通过dpkg -S查看程序所在的包

CentOS等使用rpm包的系统可以通过rpm -qf查看系统程序所在的包



原文链接:https://blog.csdn.net/gatieme/article/details/51532804

linux进程--init进程(九)相关推荐

  1. Linux的init进程(内核态到用户态的变化)

    init进程,也就是内核启动3个进程中的进程1: init进程完成了从内核态向用户态的转变: (1)init进程是比较特殊,一个进程两个状态,init刚开始运行时是内核态,他属于内核线程,然后他自己运 ...

  2. linux init进程是所有用户进程的祖先进程,Linux中init进程介绍及常用方法

    init(为英语:initialization的简写)是 Unix 和 类Unix 系统中用来产生其它所有进程的程序.它以守护进程的方式存在,其进程号为1. 所谓的init进程,它是一个由内核启动的用 ...

  3. Linux swapper进程 init进程

    进程0 :  所有进程的祖先叫做进程0 ,idle 进程或因为历史的原因叫做swapper 进程.它是在 linux 的初始化阶段从无到有的创建的一个内核线程.这个祖先进程使用静态分配的数据结构. 在 ...

  4. Android系统启动系列----init进程

    Android系统启动系列 Android系统启动系列----init进程 Android系统启动系列----Zygote进程 引言 在开发app的过程中,是不是会有疑问: java程序的运行不是从m ...

  5. Linux:守护进程解析、如何实现守护进程

    1.守护进程: 守护进程也称精灵进程(Daemon),是运行在后台的⼀一种特殊进程.它独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件.守护进程是⼀一种很有用的进程.Linux的大多数服务 ...

  6. LINUX学习之进程进阶

    进程的概念:进程是一个具有一定独立功能的程序在某个数据集上的一次运行活动. 一. 进程的一些特性 (1)动态性:进程因创建而产生,由"撤销"而消亡,因"调度"而 ...

  7. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  8. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  9. cm-14.1 Android系统启动过程分析(4)-init进程的启动、rc脚本解析、zygote启动、属性服务

    声明 前阶段在项目中涉及到了Android系统定制任务,Android系统定制前提要知道Android系统是如何启动的. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第2章-An ...

最新文章

  1. wait跟sleep的区别
  2. 结构体排序二~1339: 考试排名(带技巧的输入)
  3. 无法访问 gcr.io 的解决方案
  4. C#利用WebClient 两种方式下载文件(一)
  5. ifconfig没有ip地址_虚拟机创建后该如何获取IP地址并访问互联网实用教程
  6. 九日登望仙台呈刘明府 [唐] 崔曙
  7. 数字孪生智慧园区能源管理系统
  8. 录屏软件|录屏软件下载|录屏软件哪个好用电脑无水印版
  9. Powershell 美化,FluentTerminal.Package_0.6.1.0_Test安装设置及卸载教程
  10. 互联网行业概括,让我们熟悉和了解未来的工作环境
  11. Diamond软件的使用--(1)软件安装及配置
  12. Apache Http Server安全漏洞解决
  13. dna计算机ppt模板,七、DNA与蛋白质序列同源分析(进化树构建).ppt
  14. 如何计算前缀,网络,子网和主机号?
  15. 当我们给别人提意见时,要注意些什么?
  16. 两个质数互质是_两个互质数是什么意思
  17. 第三方账号登录功能接入完全流程
  18. cc笔记_web测试用例
  19. python运行时不让电脑休眠_python – 在不中断程序的情况下休眠
  20. 什么是过拟合、欠拟合现象以及如何缓解?

热门文章

  1. python小项目实例流程-《Python编程:从入门到实践》DEMO实例代码
  2. python爬虫入门教程-Python 爬虫介绍
  3. python1000个常用代码-Python常用代码(1)
  4. python代码块-python一些常用代码块
  5. 怎么自学python软件-python怎样才能学好?python软件开发什么
  6. python编程入门书-编程小白的第一本 Python 入门书
  7. 使用ros标定相机的内参和外参
  8. spring中的BeanPostProcessor
  9. sed、cut和awk命令的使用
  10. Django笔记(一)