全面理解前台进程,后台进程的概念,以及之间如何切换,init进程与系列文章大总结(系列文章第四篇)

前言

这个系列的文章有四篇,其目的是为了搞清楚

前台进程与后台进程的基础概念

前台进程:

  • 前台进程是与用户直接交互的进程。在任何时刻,只有一个进程组可以在前台运行。这个进程组可以从终端接收输入,向终端发送输出。如果一个前台进程正在运行,终端会被阻塞,即用户无法在终端进行其他操作,直到这个前台进程完成。

后台进程:

  • 后台进程是在后台运行,不占用用户终端的进程。它们不会阻塞用户终端,用户可以在同一终端启动新的前台或后台进程。后台进程可以向终端发送输出,但通常不能从终端接收输入。

前台进程与后台之间如何切换

在Unix-like操作系统中,可以通过一些命令在前台和后台之间切换进程。

  • 使用 ctrl+z 可以将一个正在前台执行的进程挂起,并把它转到后台。

  • 使用命令 bg 可以将一个被挂起的进程转到后台并继续执行。

  • 使用命令 fg 可以将一个在后台运行或被挂起的进程转到前台。

  • 当启动一个进程时,在命令行的最后加上 & 符号,便可以使进程在后台运行。

例如

  • 如果你在一个终端中运行一个程序,如 emacs,它将在前台运行,你不能在该终端启动新的进程。
  • 如果你按 ctrl+z, emacs 将被挂起并转到后台,你可以在终端中启动新的进程。
  • 如果你想让 emacs 继续运行,你可以键入 bg,emacs 将在后台继续运行。
  • 如果你想让 emacs 返回前台,你可以键入 fg,emacs 将在前台继续运行。

挂起与阻塞的区别

“挂起”(suspend)和"阻塞"(block)都是描述进程状态的术语,它们描述了进程暂时无法继续运行的情况,但这两者之间存在一些区别:

  • 阻塞(Blocked):阻塞状态通常发生在进程等待某种资源(例如,等待I/O操作完成)时。在这种状态下,进程无法运行,直到所需的资源可用。阻塞的进程在等待资源时不占用CPU资源,这使得操作系统可以在等待资源的进程和可运行的进程之间进行切换。阻塞的进程在获取到所需资源后会自动转为就绪状态,等待CPU的调度。

  • 挂起(Suspend):挂起状态通常发生在用户或系统决定停止一个进程的执行时。在这种状态下,进程的执行被停止,但是进程的所有状态信息(如内存、打开的文件、注册的信号处理函数等)仍然保留在系统中。挂起的进程可以在之后被恢复,恢复后的进程将从被挂起的地方继续执行。挂起的进程通常需要用户或系统管理员手动恢复。

最初始的进程——init进程

在Unix和Linux系统中,init进程是系统启动后由内核自动创建的第一个进程。它在系统的整个生命周期内一直存在,直到系统关闭。因为它是所有其他进程的祖先进程,所以它的进程ID(PID)总是1。

init进程的主要职责如下:

  • 系统启动: 当内核完成其初始化任务后(例如设置驱动程序,初始化设备等),它就会启动init进程。init进程将继续执行系统的剩余启动任务,这通常包括启动各种系统守护进程和服务。

  • 进程管理: init进程还负责管理所有其他进程。例如,当一个进程结束时,init进程负责“收养”它,防止它成为“僵尸进程”。另外,init进程还可以通过发送信号来停止或重启其他进程。

  • 系统关机: 当系统需要关机或重新启动时,init进程会负责优雅地结束所有其他进程,以确保系统的稳定和数据的完整。

在现代的Linux发行版中,传统的init进程已经被更先进的系统替代,例如Systemd和Upstart。这些新的系统提供了更多的特性和更好的性能,但是它们的基本职责(即系统启动,进程管理,系统关机)仍然和传统的init进程相同。

总的来说,init进程是一个关键的系统进程,它在整个系统的生命周期中起着至关重要的作用。

什么是系统级别的进程?什么又是用户级别的进程

  • 系统级别的进程:这些通常是由操作系统在启动时自动创建的进程,它们执行的任务通常与系统管理、硬件抽象、资源分配和控制等相关。它们通常由特权用户(如root)启动,并且运行在更高的权限级别。这些进程通常不会因为用户登录和注销而结束,因此它们常常被称为守护进程(daemon)。

  • 用户级别的进程:这些进程通常是由用户手动启动的,用于执行特定的任务或运行特定的应用程序。它们的生命周期通常与用户的会话(即登录和注销)相关联,而且它们通常运行在普通的用户权限级别下。

收官,让我们将这些所有的知识点联系起来!

我们通过这个系列的四篇文章,讲清楚了进程,shell,shell进程,终端,控制终端,前台进程,后台进程,控制进程,前台进程组,后台进程组,会话,守护进程,init进程,用户进程,系统进程,这些的基础概念。

接下来,就让我用一个例子,将这所有的概念都串联起来!

  • 当我们启动一台Linux机器时,系统的内核首先启动init进程,它是所有进程的祖先。然后,init进程继续启动其他的系统级别的进程,包括各种服务进程(如文件管理、设备管理、网络服务、安全服务等)。这些进程常常被称为守护进程,它们在系统后台运行,提供各种服务。

  • 接下来,假设我们从另一台机器上打开一个终端窗口,并通过SSH协议连接到这台Linux主机。Linux系统的SSH守护进程(sshd)收到连接请求后,会验证用户的身份信息。验证通过后,sshd进程会请求系统为用户启动一个shell进程。

  • 这个新的shell进程会创建一个新的会话,并成为该会话的领头进程。同时,它也会创建一个新的前台进程组,并成为该进程组的领头进程。然后,这个shell进程会将我们的远程终端设为新会话的控制终端。

  • 此时,我们在远程终端上看到的就是shell进程的运行环境,它正在等待我们的输入。我们可以通过在这个远程终端输入命令,来控制shell进程创建和管理新的进程。

  • 例如,当我们在shell进程中启动一个新的进程时,shell进程会暂时被挂起。新的进程会创建自己的进程组,并成为该进程组的领头进程。这个新进程就是我们所说的前台进程。当这个前台进程结束运行后,它的资源会被init进程回收,然后shell进程会重新成为前台进程,等待我们的下一个命令。

  • 如果我们在启动新进程时在命令末尾加上&,那么新进程就会在后台运行,成为一个后台进程。后台进程和前台进程类似,都会创建自己的进程组,并成为该进程组的领头进程。这个新的进程组就是我们所说的后台进程组。

  • 我们可以使用fg命令将后台进程切换到前台运行。这时,shell进程会被挂起,而切换到前台的进程就成为了新的前台进程。同时,这个进程的进程组也会成为新的前台进程组。

至此,我们就已经串联起来了整个Linux系统中的进程管理机制。真是不容易呀~

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

德亦周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值