二、进制状态转换

补充知识点

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
相关推荐
爱和冰阔落2 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
汉克老师3 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
say_fall3 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
晴天的雨.9924 小时前
【C++】继承篇
java·开发语言·c++
ö Constancy4 小时前
一台电脑的硬件组成与作用:按功能分类详解(Windows 与 Linux 视角)
linux·windows·电脑
江湖有缘4 小时前
基于Ubuntu部署SoduWork:企业级 AI 原生协同平台实战全流程
linux·人工智能·ubuntu·ai·soduwork
青少儿编程课堂4 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven4 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981034 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
无奈笑天下13 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器