总结进程、进程组、作业、会话

本篇文章主要讲述进程间关系的几个基本概念。从以下几个方面叙述:

  • 进程
  • 进程组
  • 作业
  • 会话

进程:

进程是操作系统的一个核心概念。每个进程在内核中都有一个进程控制块(PCB)来维护进程信息,这样可以使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位或其他进程并发执行的进程。

Linux内核的进程控制块是task_struct结构体。task_struct是Linux内核的一种数据结构。它会被装载到RAM里并且包含着进程的信息。

  • task_steuct结构体包含了以下内容:

这里写图片描述

  • 进程ID 为 0 的进程通常是调度进程,常常被称为「交换进程」(swapper)。

  • 进程ID 为 1 的进程是 init 进程,在系统自举过程结束时由内核调用。该进程的程序文件是 /sbin/init 。此进程负责在自举内核后启动一个 Unix 系统。init 通常会读取与系统有关的初始化文件(/etc/rc* 或 /etc/inittab,以及 /etc/init.d/ 中的文件),并将系统启动至某个状态。init 进程不会终止,系统启动后产生的所有进程都由 init 进程衍生而来。

  • task_steuct结构体组织形式:
    这里写图片描述

  • 引申:

通过上面的介绍,了解了进程的相关概念。
事实上,每个进程除了有一个进程ID(pid)之外,还属于一个进程组。
进程组是一个或多个进程的集合,每个进程组有一个唯一的进程组ID(pgid)。

这里写图片描述


进程组:

定义:进程组是一个或多个进程的集合
引入的原因:用于控制向多个进程进行信号的分发,发给一个进程组是信号会发生给进程组中每一个进程

一个进程除了有一个进程id之外,他还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一个作业相关联,可以接受来自同一终端的各种信号。每个进程组有一个唯一的进程组id。每个进程组都可以有一个组长 i 进程。组长进程的标识是其进程组id等于其进程id。组长进程可以创建一个进程组,创建该组中进程,然后终止。只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。

  • 通俗讲讲
    学校会对学生进行分班管理,假如有一个同学第一个报名,那么他的学号就是1号,他所在班级也是一班,他为这个班的班长,陆陆续续有人报名,学号为2号、3号、4号……,
    那么这个1号同学就是组长进程,这个1班就是进程组,它们的标识符是一样的,后来的进程都属于这个进程组。
    如果有一天这个班长退学了,它不上学了,那么这个1号学号就不复存在了,但是1号班级还在,并且里面的剩下其他同学也还在这个班级内。
    如果剩下的同学也陆陆续续退学了,直到这个班级还剩下一个人,那么这个班级也还仍然存在。
    如果这个班级中所有同学都不上了,一个人也没有了,那么这个班级也就不复存在了。

经过以上了解,总结以下几点:

  • 进程组长id与进程组id相同。
  • 进程组长可以终止,但进程组不会因此消失。
  • 进程组内只要还有一个进程存在,那么这个进程组就存在。
  • 进程组内所有进程终止,这个进程组就不复存在。

这里写图片描述


作业:

Shell可以进行作业控制,即可以运行一个前台作业和任意多个后台作业,每个作业是都可以是一个或者多个进程。

作业与进程组的区别:
如果作业中的某个进程又创建了子进程,则子进程不属于作业。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。

  • 作业控制

jobs:查看当前作业
fg:将后台作业放回前台
bg:将前台作业放置后台并运行

会话:

定义:Session是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。

会话是一个或多个进程组的集合。一个会话可以有一个控制终端。这通常是登陆到其上的终端设备或伪终端设备。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制终端,一个前台进程组和任意后台进程组。

这里写图片描述

  • 可以查看会话id:下图中的SID:
    这里写图片描述

  • 总结:
    梳理一下我们将之前学过的几个概念串在一起:大概画出了下面这张图:
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/80211174