进程状态转换
# 进程状态转换
# 1、进程的状态
- 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。
- 在三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。
- 运行态:进程占有处理器正在运行
- 就绪态:进程具备运行条件,等待系统分配处理器以便运 行。当进程已分配到除CPU以外的所有必要资源后,只要再 获得CPU,便可立即执行。在一个系统中处于就绪状态的进 程可能有多个,通常将它们排成一个队列,称为就绪队列
- 阻塞态:又称为等待(wait)态或睡眠(sleep)态,指进程 不具备运行条件,正在等待某个事件的完成
- 在五态模型 中,进程分为新建态、就绪态,运行态,阻塞态,终止态。
- 新建态:进程刚被创建时的状态,尚未进入就绪队列
- 终止态:进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及 有终止权的进程所终止时所处的状态。进入终止态的进程以后不再执行,但依然保留在操作系 统中等待善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。
# 2、查看进程
ps aux / ajx
- a:显示终端上的所有进程,包括其他用户的进程
- u:显示进程的详细信息
- x:显示没有控制终端的进程
- j:列出与作业控制相关的信息
- 打印出来的信息是当前时间点的进程信息,相当于快照
# 2.1 ps aux
- 每列对应的意思是:
- USER : 进程所属用户
- PID : 进程id
- %CPU :cpu使用率
- %MEM : 内存使用率 ,
- (VSZ 和 RSS没说)
- TTY : 当前进程所属终端 ,可以直接在终端输入
tty
查看当前所对应终端- STAT : 状态
STAT参数意义: D 不可中断 Uninterruptible(usually IO) R 正在运行,或在队列中的进程 S(大写) 处于休眠状态 T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核2.6开始无效) X 死掉的进程 < 高优先级 N 低优先级 s 包含子进程 + 位于前台的进程组
1
2
3
4
5
6
7
8
9
10
11
12
13
- start : 开始时间
- COMMAND : 执行了什么命令,执行什么命令产生的进程
- 看上图最后一条命令就知道,外面是用 ps aux 命令生成了这个进程
# 2.2 ps ajx
每列对应的意思是:
- 父进程id
- 进程id
- 进程组id
- 会话组id
- tty 当前进程所属终端
- 。。。
# 2.3 stat参数的含义
STAT参数意义:
D 不可中断 Uninterruptible(usually IO)
R 正在运行,或在队列中的进程
S(大写) 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核2.6开始无效)
X 死掉的进程
< 高优先级
N 低优先级
s 包含子进程
+ 位于前台的进程组
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 2.4 实时显示进程动态
(19条消息) linux下top指令参数详解及用法_linux top参数_亿只猪儿虫的博客-CSDN博客 (opens new window)
- top
- 可以在使用 top 命令时加上 -d 来指定显示信息更新的时间间隔,在 top 命令 执行后,可以按以下按键对显示的结果进行排序:
- M 根据内存使用量排序
- P 根据 CPU 占有率排序
- T 根据进程运行时间长短排序
- U 根据用户名来筛选进程
- K 输入指定的 PID 杀死进程
- q 退出
# 2.5 杀死进程
kill [-signal] pid
- kill命令默认的信号是15,即kill -15,此时系统发送一个SIGTERM的信号给对应程序,当程序接收到该信号后,具体如何处理是自己可以决定的(可结束,可忽略),结束前一般会进行一些"准备工作"。由于SIGTERM(15)的信号可以被阻塞和忽略,这也导致有时候使用kill命令没办法"杀死"应用;
- 9 号信号能够强制杀死进程,系统会发出SIGKILL信号,要求接收到该信号的程序立即结束运行,不能被阻塞或忽略,这通常会带来一些副作用,因为应用程序没有时间进行"准备工作",可能造成数据丢失或者终端无法恢复到正常状态等;
kill –l
列出所有信号
kill –SIGKILL 进程ID
/kill -9 进程ID
(可以直接写宏,也可以写对应的信号值)- 下图,在自己终端,杀死自己终端是不成功的,必须加
-9
来强制杀死进程
killall name
根据进程名杀死进程- 这里要注意写入命令的当前路径,比如在终端2里删除,但是这时我们已经进入到了Linux目录下,那我们就应该这样写:
killall ./a.out
- 这里要注意写入命令的当前路径,比如在终端2里删除,但是这时我们已经进入到了Linux目录下,那我们就应该这样写:
# 2.6 后台运行
- 有时我们可以使用
可执行文件 &
这样的命令让程序在后台运行,但是显示到终端- 下图,第一次运行,就是前台运行,这样如果我们不杀死这个进程,我们就不能输入其他命令
- 所以,后台运行的好处就是可以在执行其他进程的同时,进行写入指令
# 3、进程号和相关函数
- 每个进程都由进程号来标识,其类型为 pid_t(整型),进程号的范围:0~32767。 进程号总是唯一的,但可以重用。当一个进程终止后,其进程号就可以再次使用。
- 任何进程(除 init 进程)都是由另一个进程创建,该进程称为被创建进程的父进程, 对应的进程号称为父进程号(PPID)。
- **进程组是一个或多个进程的集合。**他们之间相互关联,进程组可以接收同一终端的各 种信号,关联的进程有一个进程组号(PGID)。默认情况下,当前的进程号会当做当前的进程组号。
- 进程号和进程组相关函数:
pid_t getpid(void);
pid_t getppid(void);
pid_t getpgid(pid_t pid);
编辑 (opens new window)
上次更新: 2023/09/13, 12:29:52