[Linux 高并发服务器] 进程状态的转换
根据牛客的c++项目课程做笔记,图片和知识点均摘录自该课程
进程的状态转换
进程状态反映进程执行过程的变化,这些状态随着进程的执行和外部条件的变化而转换
三态模型
运行态:进程占有处理器正在运行
就绪态:进程具备运行条件,等待系统分配处理器以便运行,如果已经分配到除CPU外的资源,一旦获得CPU就立刻执行。在一个系统当中,处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列
阻塞态:又称为等待(wait)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。注意,阻塞态不会直接变成运行态。
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_进程组](https://file.cfanz.cn/uploads/png/2022/11/25/11/bN30fbda07.png)
五态模型
相比三态模型多了两个状态
新建态:进程刚被创建时的状态,尚未加入到就绪队列
终止态:进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止所到达的状态。进程被终止后不再执行,但会保留在操作系统中善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_杀死进程_02](https://file.cfanz.cn/uploads/png/2022/11/25/11/932UEf6231.png)
进程相关的命令
查看进程的信息
ps aux
a:显示终端上所有进程,包括其他用户的进程
u:显示进程详细信息
x:显示没有控制终端的进程
j:列出与作业控制相关的信息(可以看父进程,进程组,会话的ID)
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_杀死进程_03](https://file.cfanz.cn/uploads/png/2022/11/25/11/6QbWbf0S99.png)
显示的是输入ps aux瞬间的进程信息,并非动态的
USER进程所属用户
PID进程的ID
%CPUCPU的使用
%MEM内存的使用
VSZ是常驻内存集(Resident Set Size),表示该进程分配的内存大小
RSS表示进程分配的虚拟内存
TTY进程所属的终端
STAT状态
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_杀死进程_04](https://file.cfanz.cn/uploads/png/2022/11/25/11/6X9YHY69C1.png)
START开始的时间
TIME持续的时间
COMMAND执行哪个命令产生的这个进程
ps ajx
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_linux_05](https://file.cfanz.cn/uploads/png/2022/11/25/11/42Z50Td0fe.png)
PPID父进程的ID
PGID进程组的ID
SID会话的ID
TPGID tty process group ID for the process group leader貌似是终端进程组ID之类的(暂时不了解这玩意)
实时显示进程的动态
top
-d指定显示信息更新的时间间隔
M根据内存使用量排序
P根据CPU占有率排序
T根据进程运行时间长短排序
U根据用户名字筛选排序
K输入指定的PID杀死进程
杀死进程
kiil PID
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_父进程_06](https://file.cfanz.cn/uploads/png/2022/11/25/11/73HM39b5JW.png)
发现如果杀死自己终端是不行的,需要加上参数-9强制杀死进程-9实际上就是KILL信息,可以通过kill -l查看发现是第9个
![在这里插入图片描述 [Linux 高并发服务器] 进程状态的转换_linux_07](https://file.cfanz.cn/uploads/png/2022/11/25/11/d1EM90Y3I8.png)
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);//如果传None获取当前进程的进程组id,如果传进程号获取进程号的进程组ID










