[架构之路-31]:目标系统 - 系统软件 - Linux OS 什么是Linux1号进程? init进程与systemD的比较?

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构之路-31]:目标系统 - 系统软件 - Linux OS 什么是Linux1号进程? init进程与systemD的比较?相关的知识,希望对你有一定的参考价值。

目录

第1章 Linux内核启动应用程序的方式

1.1 什么是Linux 0号进程:idle进程

1.2 什么是Linux 1号进程:init进程

1.3 Linux 1号进程的作用

1.4 Linux 1号进程启动应用程序的两种机制

第2章 init进程机制与systemD机制的比较

2.1 出现的时间不同

2.2 串行与并行的方式不同

2.3 组织服务的方式不同

2.4 管理线程的技术手段不同

2.5 功能复杂性不同

2.6 运行级别不同


第1章 Linux内核启动应用程序的方式

1.1 什么是Linux 0号进程:idle进程

0号进程, 通常也被称为idle进程,是内核无事可做时执行的进程。是空闲进程,也就是死循环。

struct task_struct init_task = INIT_TASK(init_task);
set_task_stack_end_magic(&init_task);  
使用全局变量来设置进程全局环境。
作用:
	1 初始化各个模块  (MM/FS/VFS/sched)
	2 创建1号进程 2号进程  
		1号进程 kernel_thread(kernel_init, NULL, CLONE_FS); 
		2号进程 kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
	3 把自己变成idle。(当任务链没有任务,会执行idle进程)	
			cpu_startup_entry	
				do_idle();

1.2 什么是Linux 1号进程:init进程

run_init_process(execute_command);
	do_execve
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")
主要用户加载根文件系统init进程,然后回到应用态,它是所用应用程序进程的祖先进程

1.3 Linux 1号进程的作用

(1)负责在用户空间完成对Linux系统进一步的初始化,mount文件系统、动态插入内核模块等。

(2)它是所有用户空间进程的祖先进程,负责fork系统中所有的其他用户进程。

(3)负责用户空间应用程序的初始化。

(4)负责监控和管理用户空间的进程。这是1号进程一项重要的职责。

1.4 Linux 1号进程启动应用程序的两种机制

从上图可以看出:根文件系统是由Linux内核进行加载的,根文件系统是挂载在虚拟文件系统之下。当内核加载或挂载完根文件系统之后,Linux就会读取根文件系统中的可执行文件,执行后续的应用程序的初始化。

Linux提供了两种不同机制启动和管理根文件系统中的程序。

(1)内核版本2.6以及之前的版本,内核是通过init进程和inittab来加载根文件系统中的程序。

(2)内核版本3.10以及以后的版本,内核是通过SystemD进程和xxx.target文件来加载根文件系统中的程序。

根文件系统中的程序包括:

  • Linux的系统程序
  • 内核模块ko
  • 用户程序

第2章 init进程机制与systemD机制的比较

2.1 出现的时间不同

  • Centos6以前用的都是init来启动服务;
  • Centos7开始默认使用了systemd管理服务;

2.2 串行与并行的方式不同

  • init串行启动所有服务;启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • systemd并行启动所有服务,充分利用多内核架构。启动快速,启动速度是init进程的10倍以上。

2.3 组织服务的方式不同

  • init启动的服务分两类:独立启动模式(stand alone)和超级守护进程(super daemon);
  • systemd将所有服务定义为不同类型的服务单位(unit),类型有:service、socket、target、path、snapshot、timer等

2.4 管理线程的技术手段不同

  • init下管理程序使用纯脚本/etc/init.d/daemon可自定义参数;启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
  • systemd使用systemctl命令来管理,不可自定义参数,有语法限制。

2.5 功能复杂性不同

  • init没法自动启动当前服务所依赖的其他服务,必须手动处理,init对进程管理的方式比较单一。
  • systemd可以检查并启动当前所启动的服务所依赖的其他服务,systemd对进程管理的方式强大。

备注:

在较新的linux系统上,都使用systemd 取代了init,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。systemd为系统启动和管理提供了完整的解决方案

不是通过systemctl启动的服务则没法通过systemd来管理。

2.6 运行级别不同

  • init有7个运行级别
  • systemd只有1、3、5有相对应的target类型。

以上是关于[架构之路-31]:目标系统 - 系统软件 - Linux OS 什么是Linux1号进程? init进程与systemD的比较?的主要内容,如果未能解决你的问题,请参考以下文章

[架构之路-56]:目标系统 - 平台软件 - 总体架构概述

[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程

[架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程

[架构之路-21]:目标系统 - 系统软件 - 计算机系统架构计算机指令系统结构化程序与分层编程。

[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术

[架构之路-26]:目标系统 - 系统软件 - bootloader uboot使用方法常用命令