【Linux】进程组、作业、会话以及终端的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ArchyLi/article/details/79196681

一、进程组

(1)概念

我们知道每一个进程除了自己的进程 ID外,还拥有一个进程组ID。

多个进程组成的集合叫做进程组。他们彼此之间不是孤立的,存在父子、兄弟等关系,每个进程都有父进程(除了0号进程),而所有的进程的父进程都是以init进程为根,形成一个树状结构。

如果我们需要发送一个任务到10个进程,让这10个进程去执行,但是如果我们因为某种原因需要终止这项进程,则需要一个一的把这些任务删除,并且还需要按照原来进程间的关系来删除。现在有了进程组,我们如果需要执行任务,则可以将这个任务发送到这个进程组,让这个进程组内所有进程执行,嗯u过想要取消这个任务,则可以通过进程组来取消,并且保证是按照进程间的关系来进行执行的。

(2)进程组的生命周期

进程组的生命周期从创建开始到其中最后一个进程离开为止的时间区称为进程组的生命期。

(3)进程组ID

进程组ID类似与进程ID–它是一个正整数,可以存放在pid_t数据类型中。我们可以通过getpgrp函数返回调用进程的进程组ID。进程组ID指的是组长进程的ID,所有进程的PGID都是该组的组长,该组是或否存在,只要组中至少还有一个进程存在,则该组存在,并且剩余的进程于它是否是组长进程是没有关系的。

二、作业

(1)概念

shell分前后台来控制的不是进程而是作业,或者进程组,一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成。

作业是一个多个进程组成的集合,作业更多的偏向于多个进程完成的任务。

(2)作业控制:

shell可以运行一个前台进程和多个后台进程。

我们可以使用组合键ctrl+z放入后台暂停执行。
fg把暂停或者后台执行的作业放入前台执行。
bg命令把之前暂停的作业放入后台继续执行。
bg和fg命令如果不带参数,则默认操作最近的一个作业,也可以添加上参数,例如%2,标识第二个作业。

前台和后台进程的区分是:

在前台运行的一项作业。也是用户使用的又控制终端的进程。
后台作业就是独立于控制终端的进程。

(3)作业与进程组的区别

如果我们在作业中的某个进程又创建了一个子进程,则子进程不属于作业。但是进程组中子进程创建一个进程,则这个进程属于这个进程组。

一旦作业运行结束,Sell会把自己提到前台,如果原来的前台进程还在,并且这个进程还没有终止,则他会自动变为后台进程。

三、会话

会话是一个或者多个进程组的集合,一旦当我们登陆一次操作系统,就形成了一次会话,一个会话可能包含多个进程组,但是只能有一个前台进程组。一个会话可以有一个控制终端。这通常是登陆到其上的终端设备(在终端登陆情况下)或伪终端设备(在网络登陆情况下)。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。

$ proc1 | proc2 &  
$ proc3 | proc4 | proc5   

我们可以看到proc1和proc2是在后台运行的,proc3和proc4以及proc5是在前台运行的,前面两个同属于一个后台进程组,后面三个同属于一个前台进程组,shell本身又属于一个单独的进程组,这些进程组的控制终端相同,它们属于一个会话。如果此时当我们在控制终端输入一些特殊的控制键,内核将会发送相应的信号给前台进程组中的所有进程。

四、终端

  • 会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端 (SVR4/Linux)

  • 与控制终端建立连接的会话领头进程称为控制进程 (session leader)

  • 一个会话只能有一个控制终端

  • 产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程

  • 终端上的连接断开时 (比如网络断开或 Modem 断开), 挂起信号将发送到控制进程(session leader)

进程属于一个进程组,进程组属于一个会话,会话可能有也可能没有控制终端。一般而言,当用户在某个终端上登录时,一个新的会话就开始了。进程组由组中的领头进程标识,领头进程的进程标识符就是进程组的组标识符。类似地,每个会话也对应有一个领头进程。

同一会话中的进程通过该会话的领头进程和一个终端相连,该终端作为这个会话的控制终端。一个会话只能有一个控制终端,而一个控制终端只能控制一个会话。用户通过控制终端,可以向该控制终端所控制的会话中的进程发送键盘信号。

同一会话中只能有一个前台进程组,属于前台进程组的进程可从控制终端获得输入,而其他进程均是后台进程,可能分属于不同的后台进程组。

当我们打开多个终端窗口时,实际上就创建了多个终端会话。每个会话都会有自己的前台工作和后台工作

通过线路规程来获取用户的输入,它是对用户输入的一个过滤器,如果是正常字符,则不做任何处理,如果是组合键,则他会将该组合件变成相应的信号

下图表明了会话和进程组以及终端的概念
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ArchyLi/article/details/79196681