PID 1

上篇说到加载完 kernel 后会 init 用户态第一个进程,PID 1,又叫超级进程,也叫根进程,它负责产生其他所有用户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被 kill 。如果一个子进程的父进程退了,那么这个子进程会被挂到 PID 1 下面。

下面我们就来说说 PID 1历史上是如何启动的。

回溯历史

SysV Init

  1. 产生于命令行时代
  2. 串行启动进程
  3. 一次性全部启动

Upstart

  1. 为了解决桌面时代热插拔的问题
  2. 基于事件驱动
  3. Job/Event 的设计

Systemd

  1. 为了解决不够快的问题
  2. 按需启动
  3. 并行启动

如何做到快?

  1. 处理了Socket/D-bus/fs之间的依赖
  2. 用纯C语言代替了Shell启动脚本

三者启动蓝牙程序的对比

compare

除此之外

  1. 可以跟踪上服务进程所fork/exec出来的所有进程
  2. 简化了整个 daemon 开发的过程
  3. 自动检测启动的服务间有没有环形依赖
  4. 内建 autofs 自动挂载管理功能
  5. 改造了传统的 syslog 的问题,采用二进制格式保存日志,日志索引更快
  6. 快照和恢复。对当前的系统运行的服务集合做快照,并可以恢复
  7. ……

这时候有谁出来喊了,Systemd 干了很多本不该他管的事情,于是开始有人抵制并抗议这种做法。

圣战打响

起因

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反”keep simple, keep stupi d”的Unix 哲学

arch

发展

起初 Systemd 的作者 Lennart 写了篇文章解释大众对 Systemd 的误解,但丝毫不起作用,并且在网络上招受到大量的语言暴力,甚至收到死亡威胁邮件。

于是 Lennart 写了篇帖子来抨击 Linux 社区及 Linus 本人,说 Linus 领导的 Linux 组织已经是一个彻头彻尾的邪教。

随后,Linus 在有一次采访中也对此发表了自己的看法,大意如下图。

fuck

结果

目前几乎所有Linux发行版都用 Systemd 来启动及管理进程。

附录

systemdt 的 pstree

systemd

init 的 pstree

init

参考资料

https://coolshell.cn/articles/17998.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html