init进程是Linux内核启动的第一个进程,自然也是其他进程的父进程,但是当我们在终端下执行pstree命令时,即以树的形式显示所有进程的层次时,会发现应该是init进程的地方却变成了systemd。
部分截图如下:
1.systemd是什么
systemd是linux系统中最新的初始化系统,systemd和ubuntu中的upstart是竞争对手,但是ubuntu现在也采用了systemd,其实systemd的很多概念都来源于Mac OC系统上的launchd。
systemd和init都由linux内核加载运行, 都是系统中第一个进程,PID永远为1。
2.为什么systemd取代了init
init:
启动时间长,init是串行(后面有介绍)启动,只有前一个进程启动完,才会启动下一个进程;
启动脚本复杂,init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长;
而且当sysvinit系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行,并且系统必须等待所有的服务都启动就绪后,才允许用户登录,那么它的缺点也就很显而易见了:
1.启动时间过长
2.系统浪费资源
某些服务可能在很长一段时间内都没有被使用,比如打印服务在多数服务器上很少被真正使用到。所以说,启动这些服务是没有必要的,浪费资源又浪费时间。
systemd:
按需启动服务,顾名思义,只有当某个服务真正被请求的时候才启动它,当该服务结束,systemd可以关闭它,等待下次需要时再次启动它,减少系统资源消耗;
尽可能启动更少进程,尽可能多的并行启动进程,尽可能减少对shell脚本的利用,减少系统启动等待时间;
什么是串行,什么是并行,什么是并发?举个栗子
吃饭吃到一半,电话来了,一直吃完了以后才去接,这说明支持串行;
吃饭吃到一半,电话来了,停下来接了电话,接完后继续吃饭,这说明支持并发;
吃饭吃到一半,电话来了,一边打电话,一边吃饭,说明支持并行;
并发的关键是你有处理多个任务的能力,不一定要同时,并行的关键是你有同时处理多个任务的能力
关键在于同时:
并发是轮流的处理多个任务,并行是同时处理多个任务;
结合csapp上的定义:
并发流的思想与流运行的处理器核数或者计算机数无关。如果两个流在时间上重叠,那么它们就是并发的,即使它们是运行在同一个处理器上的;
如果两个流并发的运行在不同的处理器核或者计算机上,称为并行流;
此处我的理解是:
并发是在一个cpu上同时(并不是真正的同时,因为cpu在多个程序中切换的时间很短,看起来是同时)跑多个程序;
并行是每一个cpu运行一个程序(同时);
而且systemd采用linux的cgroups跟踪和管理进程的生命周期:
systemd利用了linux内核的特性即cgroups来完成跟踪的任务,当停止服务时,通过查询cgroups,systemd可以确保找到所有的相关进程,从而干净的停止服务。
cgroups已经出现了很久,它主要用来实现系统资源配置管理。当进程创建子进程时,子进程会继承父进程的cgroups,所以无论创建多少子进程,所有的这些相关进程都会属于同一个cgroups,systemd只需要遍历指定的cgroups即可找到所有相关的进程,将它们一一停止即可。
cgroups 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。