【学习笔记】3. 一个进程的演变

 阅读约 4 分钟

0. 同系列索引

  1. 进程与进程组
  2. 各种不同的进程
  3. 一个进程的演变

1. init进程

1.1 1号进程的创建

内核态创建进程使用 kernel_thread ,用户态创建进程使用 fork

kernel_thread 会创建 init 进程 和 ktheadd 内核线程就是常说的 1号进程和2号进程

  • 1号进程是所有进程的祖先 : 用户空间,
  • 2号进程 负责管理内核中的进程 : 内核空间

这二个进程维护系统的所有进程

此时1号进程还是在内核空间。
execve 函数把控制器从内核空间切换到用户空间。
通过加装用户空间的应用程序(exec 加装应用文件),然后 kernel_thread 创建的init进程,就变成了用户空间的第一个进程

clipboard.png
图:可以看出 1号进程和2号进程的父子关系

clipboard.png
图:所有进程的父进程,起源都是1号进程和2号进程。

1.2 1号进程做了什么?

clipboard.png

1号进程到了用户态之后,做了什么: 完成各种初始化

clipboard.png

1.3 1号进程的特征

clipboard.png

  • 用户空间的所有进程都是init进程fork产生的
  • init进程会转换为守护进程

2. 进程的init 过程

  1. 0号进程
  2. init内核进程
  3. 1号init用户进程
  4. getty进程
  5. shell 进程

前面的部分已经介绍了 1-3 步骤
第四步:1号进程fork一个子进程,启动getty。 如果用户登录了,就会启动一个login进程,验证登录。

所以没有登录,没有到第四步的终端,如下图

clipboard.png

第五步:启动一个bash进程,在bash里面运行shell命令

clipboard.png

3. init 进程的演变

这个特别需要记住

clipboard.png

上面集中是 init 服务进程的演变,各有优缺点。

因为日常不会再想init完全过程那样了,在虚拟终端和伪终端,使用了不同的演变方式。
比如 sysvinit 通过加载 init.d 文件。
比如我们在上面的介绍中,托管子进程是 upstart。它可以并发运行。
虚拟终端中使用的是 :systemd。(广为使用的)

我们在了解的时候,不是靠记忆,而是知道它的原理,然后理解就可以了。

100. 致敬

如有不详,请参考王老师的精彩讲解
学习过程中,获得了极大的满足感,把之前的一些东西串联了起来。十分感谢 王利涛老师
在此表示感谢。
PS:本文中所有的资源和图片均来自视频中

阅读 275更新于 5月23日
推荐阅读
学习总结笔记
用户专栏

记录一下学习的总结。 学习过程中使用“费曼学习法”

2 人关注
29 篇文章
专栏主页
目录