内核态建立进程使用kernel_thread
,用户态建立进程使用fork
kernel_thread
会建立 init 进程 和 ktheadd 内核线程就是常说的 1号进程和2号进程html
这二个进程维护系统的全部进程shell
此时1号进程仍是在内核空间。execve
函数把控制器从内核空间切换到用户空间。
经过加装用户空间的应用程序(exec 加装应用文件),而后 kernel_thread
建立的init
进程,就变成了用户空间的第一个进程。segmentfault
图:能够看出 1号进程和2号进程的父子关系bash
图:全部进程的父进程,起源都是1号进程和2号进程。并发
1号进程到了用户态以后,作了什么: 完成各类初始化函数
init
进程fork
产生的init
进程会转换为守护进程前面的部分已经介绍了 1-3 步骤
第四步:1号进程fork一个子进程,启动getty。 若是用户登陆了,就会启动一个login进程,验证登陆。学习
因此没有登陆,没有到第四步的终端,以下图spa
第五步:启动一个bash进程,在bash里面运行shell命令线程
这个特别须要记住
上面集中是 init 服务进程的演变,各有优缺点。code
由于平常不会再想init彻底过程那样了,在虚拟终端和伪终端,使用了不一样的演变方式。
好比 sysvinit
经过加载 init.d
文件。
好比咱们在上面的介绍中,托管子进程是 upstart。它能够并发运行。
虚拟终端中使用的是 :systemd。(广为使用的)
咱们在了解的时候,不是靠记忆,而是知道它的原理,而后理解就能够了。
若有不详,请参考王老师的精彩讲解
学习过程当中,得到了极大的知足感,把以前的一些东西串联了起来。十分感谢 王利涛老师在此表示感谢。PS:本文中全部的资源和图片均来自视频中