进程的五种状态

进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。
在三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。在五态模型
中,进程分为新建态、就绪态,运行态,阻塞态,终止态。

  • 新建态:进程刚被创建时的状态,尚未进入就绪队列
  • 就绪态:进程具备运行条件,等待系统分配处理器以便运行。当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列
  • 运行态:进程占有处理器正在运行
  • 阻塞态:又称为等待(wait)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成
  • 终止态:进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。进入终止态的进程以后不再执行,但依然保留在操作系统中等待善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。

进程的三态模型(三种状态)

报错当前处于JRE环境并且无法以SPI的形式获得Javacompiler实例_进程状态

进程的五态模型(五种状态)

报错当前处于JRE环境并且无法以SPI的形式获得Javacompiler实例_进程组_02

进程相关命令

什么shell,什么是终端

Shell是计算机操作系统中提供给用户进行交互的命令行解释器,它读取从终端输入的命令并将其传递给内核处理。在Linux系统中,常见的shell包括bash、zsh等。

终端(Terminal)则是指向计算机上的一个物理设备,它通常显示一个命令行界面,让用户可以通过键盘输入Shell命令,并可以看到Shell命令输出的结果。

因此,可以说终端是一个提供给用户输入和输出的界面,而Shell则负责接收用户输入的命令,并将相应的程序运行起来,是命令行的解释器。在GUI环境下,一些模拟终端的软件也可以提供与Shell类似的功能。

注意:终端也是一个进程,使用命令tty,可以知道当前运行终端的终端名称。结合着使用ps命令,可以查到终端名字对应的进程编号。

ps命令

当在Linux中查看进程信息时,可以使用 ps 命令。它用于列出当前运行的所有进程以及它们的各种状态信息。

ps 命令最基本的用法是:ps 这将默认显示当前 shell 中所有的进程以及它们的状态信息。

其中,一些常用的选项包括:

  • -a: 显示一个终端的所有进程,包括其他用户的进程。
  • -x: 显示所有进程,无论它们是否与任何终端关联。
  • -u: 以用户为基础显示进程信息。
  • –sort: (里面是两个短杠,怕你们看不清)按照特定的列来排序输出,例如:–sort=-pcpu 表示按 CPU 使用率递减排序。
  • j:列出与作业控制相关的信息

以下是一些常见的 ps 命令选项及其含义:

nowcoder@nowcoder:~/Linux$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 225508  9468 ?        Ss   3月11   0:08 /lib/systemd/systemd --system --deserialize 39
root         2  0.0  0.0      0     0 ?        S    3月11   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   3月11   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   3月11   0:00 [rcu_par_gp]

USER: 该进程所属用户的名称或 ID。
PID: 进程的唯一标识符。
%CPU: 进程当前使用 CPU 的百分比。
%MEM: 进程当前使用系统内存的百分比。
VSZ: 进程虚拟内存大小(单位 KB)。
RSS: 进程当前使用物理内存的大小(单位 KB)。
TTY: 与哪个终端设备关联(如果有的话)。
STAT: 进程的状态代码。这些字母可以是 S(休眠)、R(运行)、I(空闲)等。
START: 进程被启动的时间戳。
COMMAND: 由用户指定的命令。

STAT状态意义
  • D 不可中断 Uninterruptible(usually IO)
  • R 正在运行,或在队列中的进程
  • I 空闲进程
  • S(大写) 处于休眠状态
  • T 停止或被追踪
  • Z 僵尸进程
  • W 进入内存交换(从内核2.6开始无效)
  • X 死掉的进程
  • < 高优先级
  • N 低优先级
  • s 包含子进程
  • (+)位于前台的进程组

状态I 与 状态Z 的区别:

在Linux进程状态中,STAT字段中的I状态指的是空闲状态(Idle)。具体来说,I状态表示进程处于不活动状态,并且没有等待任何事件或者资源;
该状态通常与Zombie进程有所区别,因为后者已经退出,但是内核仍然保持了它的父进程ID和一些其他信息。在ps命令结果中,I状态下的进程通常被标记为I 。

tty 命令

在终端输入:tty ,系统就会告诉你当前你的终端是什么?(是哪个终端,终端编号)

top命令

作用:实时显示进程动态

可以在使用 top 命令时加上 -d 来指定显示信息更新的时间间隔,在 top 命令执行后,可以按以下按键对显示的结果进行排序:

  • M 根据内存使用量排序
  • P 根据 CPU 占有率排序
  • T 根据进程运行时间长短排序
  • U 根据用户名来筛选进程
  • K 输入指定的 PID 杀死进程

kill命令

作用:杀死进程

相关用法以及所需参数:

  • kill [-signal] pid
  • kill –l 列出所有信号
  • kill –SIGKILL 进程ID
  • kill -9 进程ID
  • killall name 根据进程名杀死进程

进程号和相关函数

每个进程都由进程号来标识,其类型为 pid_t(整型),进程号的范围:0~32767。进程号总是唯一的,但可以重用。当一个进程终止后,其进程号就可以再次使用。

任何进程(除 init 进程)都是由另一个进程创建,该进程称为被创建进程的父进程,对应的进程号称为父进程号(PPID)。

进程组是一个或多个进程的集合。他们之间相互关联,进程组可以接收同一终端的各种信号,关联的进程有一个进程组号(PGID)。默认情况下,当前的进程号会当做当前的进程组号。

进程号和进程组相关函数:

  • pid_t getpid(void);
  • pid_t getppid(void);
  • pid_t getpgid(pid_t pid);