二、进制状态转换

补充知识点

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
相关推荐
handler011 小时前
【MySQL】常用命令总结(库与表增删查改)
运维·数据库·mysql·命令·总结
week@eight1 小时前
Linux - Doris
linux·运维·数据库·mysql
云泽8081 小时前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
平行云2 小时前
实时云渲染预启动技术解析:UE数字孪生应用的延迟优化机制(二)
linux·unity·ue5·webgl·实时云渲染·云桌面·像素流
繁华落尽,倾城殇?2 小时前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
看到代码头都是大的2 小时前
CentOS环境下手动升级openssl、openssh
linux·运维·centos
浮生若城2 小时前
Linux——Ext系列文件系统
linux·运维·服务器
ITyunwei09872 小时前
主流 SaaS 工单系统对比
运维·服务器·人工智能
01_ice2 小时前
C语言数据在内存中的存储
c语言·开发语言