二、进制状态转换

补充知识点

1. tty 命令

  • 全称
    tty = Teletype(电传打字机,早期电脑的输入输出设备)
  • 命令作用
    显示你当前正在使用的终端设备文件名。

    当我们执行 ps aux 时,如果有多个终端同时开的情况,就会无法找到想要杀死进程的进程 ID ,这里输出结果 TTY 的那一列就对应着 tty 命令打印的终端设备文件名,这样就可以准确杀死进程了。

进制的状态

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

三态模型

  • 运行态:进程占有处理器正在运行。
  • 就绪态:进程具备运行条件,等待系统分配处理器以便运行。当进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU ,便可立即执行。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
  • 阻塞态:又称为等待 (wait) 态或睡眠 (sleep) 态,指进程不具备运行条件,正在等待某个事件的完成。

五态模型

  • 新建态:进程刚被创建时的状态,尚未进入就绪队列。
  • 终止态:进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。进入终止态的进程以后不再执行,但依然保留在操作系统中等待善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。

进程相关命令

查看进程

ps 命令⽤于查看系统进程信息,process 的缩写。

  • 常⽤参数组合
    • ps aux:显示所有⽤户进程详细信息。
    • ps ajx:显示作业控制相关信息。
  • 参数详解
    • ps:全称 Process Status ,进程状态。
    • a:显示终端上的所有进程,包括其他用户的进程。
    • u:显示进程的详细信息。
    • x:显示没有控制终端的进程。
    • j:列出与作业控制相关的信息。

ps aux 演示:

  • 输出字段:
    • USER:进程所属⽤户
    • PID:进程 ID
    • %CPU:CPU使⽤率
    • %MEM:内存使⽤率
    • TTY:所属终端
    • STAT:进程状态
    • START:启动时间
    • TIME:运⾏时间
    • COMMAND:执⾏的命令

ps ajx 演示:

  • 输出字段:
    • PPID:父进程 ID
    • PID:进程 ID
    • PGID:进程组 ID
    • SID:会话 ID
    • TTY:所属终端
    • TPGID:前台进程组 ID
    • STAT:进程状态
    • UID:用户 ID
    • TIME:运行时间
    • COMMAND:执行的命令

STAT 状态码

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

实时显示进程动态

top 命令动态显示进程信息,默认按 CPU 使用率从高到低排序,三秒刷新一次。

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

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

杀死进程

kill命令终⽌指定进程

bash 复制代码
kill [-signal] pid

常用方式

  • kill --l:列出所有信号。
  • kill --SIGKILL:强制终止进程。
  • kill -9:强制终止进程 (SIGKILL 是信号 9 的宏)。
  • killall name:根据进程名杀死进程。

注意事项

  • 普通⽤户只能终⽌⾃⼰的进程。
  • 前台进程需要 -9 参数强制终⽌。
  • 终端进程终⽌会导致连接断开。

后台进程

  • 命令后加 & 可使进程在后台运⾏。
  • 如果进程有输出仍会输出到当前终端,但此时可以在终端执行其他命令。

创建一个 a.c 程序:

c 复制代码
#include <stdio.h>
#include <unistd.h>
int main()
{
     while(1)
     {
          printf("hello\n");
          sleep(5);
     }
        
     return 0;
}

编译并后台运行该程序:

bash 复制代码
gcc a.c
./a.out &

这里可以看到终端依然在输出,但当我杀死无限循环的进程后就不再输出 hello 了:

进程号和相关函数

  • 每个进程都由进程号来标识,其类型为 pid_t(整型),进程号的范围:0~32767。
    进程号总是唯一的,但可以重用。当一个进程终止后,其进程号就可以再次使用。
  • 任何进程(除 init 进程)都是由另一个进程创建,该进程称为被创建进程的父进程,
    对应的进程号称为父进程号(PPID)。
  • 进程组是一个或多个进程的集合。他们之间相互关联,进程组可以接收同一终端的各
    种信号,关联的进程有一个进程组号(PGID)。默认情况下,当前的进程号会当做当
    前的进程组号。
  • 进程号和进程组相关函数:
    • pid_t getpid(void); 获取当前进程 ID
    • pid_t getppid(void); 获取父进程 ID
    • pid_t getpgid(pid_tpid); 获取进程组 ID
相关推荐
三言老师5 小时前
K8s集群运行时自动化运维全覆盖落地实操(下)
linux·运维·服务器·网络
Super 含6 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
wuyk5556 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
ltl6 小时前
HAProxy HTX 与 HTTP 路径:内部表示、改写落点与协议分叉
linux
ltl6 小时前
可拆分 OS:CXL 内存池化如何动摇本地 DRAM 假设
linux
ltl6 小时前
Tetragon 强制执行:Override 与 SIGKILL 各自保证什么
linux
峥无6 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152006 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
lengjingzju6 小时前
编译与调试完全指南—第6章 性能分析工具
linux
wp123_17 小时前
IPX8 防水 Type‑C连接器:安费诺 124018792112A 与 TONEVEE TY48087‑24A 技术梳理
c语言·开发语言