🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
文章目录
进程的状态
更改状态,本质上就是更改test_struct 中的 status字段,通过宏定义多种状态的值
新建
进程被更改创建出来,初步具备了进程的相关结构,还没有征得操作系统的 允许,还不能够被运行,字面意思
运行
task_struct 结构体在运行队列中排队,就叫做运行态
通过调度算法调度 并且在等待CPU的资源 的调度队列,我们把它称为运行队列
系统中是存在各种资源的(不仅仅是CPU),网卡,显卡,磁盘等等其他设备,所以,系统中一定不止一种队列,有多个队列,而CPU所配对的这个调度队列就是运行队列
阻塞
等待非CPU资源就绪,进程所处的状态就叫做阻塞状态,也就是说并不在运行队列中排队,而是在其他的非CPU的调度队列中排队,这种非CPU的调度队列就叫做阻塞队列
int main()
{
int a=0;
scanf("%d",&a);
}
//等待键盘输入这就是等待非CPU资源就绪,这就是阻塞状态,比如像网页卡死
//也是阻塞状态,在等待网络资源就绪
挂起
内存快满时,操作系统(适当置换)将长时间不执行的进程的代码和数据(PCB还在内存当中)换出到磁盘当中(磁盘当中有一个分区叫做SWAP),这时候的这个状态就叫做挂起
退出
字面意思
进程的七种状态RSDTTZX
STAT即为status状态
1.R(Running)运行状态
并不意味着进程一定在运行中,表明在运行中或者在运行队列当中
可以看到上图的状态一直在变化,因为CPU一直在做事情而且它太快了,printf需要访问外设,因为printf被执行了所以一定有运行状态,当进程向显示器打印的时候,需要做一定程度的等待,这时进程的PCB在阻塞队列当中,就绪时才又拿给CPU,这个过程特别快,所以,很多时候看到的都是S状态。
#include <stdio.h>
int main()
{
while(1)
return 0;
}
而只进行一个死循环的时候,看到的只有R状态,所以printf访问外设也可以使进程处于某种阻塞状态
./status_test & 就是让程序在后台运行,会返回进程的PID,此时的运行状态就是R,所以,不带+的状态就是后台进程,带+就是前台进程
2.S(Sleeping)可中断睡眠
意味着进程在等待事件完成(这里的睡眠又叫做可中断睡眠interruptible sleep)
对应的就是 阻塞状态
3.D(DiskSleep)深度睡眠
睡眠状态,磁盘睡眠,深度睡眠,不可中断睡眠
当服务器压力过大的时候,操作系统会通过一定的手段,杀掉一部分进程,起到节省空间的作用(比如写一个死循环,一直malloc空间,然后占那么大空间,资源很紧张,你还不用,OS可能就直接给你杀掉了)
但是当状态为D的话就是深度睡眠,OS不能够去干掉他,所以也叫作不可中断睡眠,只能等 这个进程自己醒来,哪怕是kill -9
都不能够杀掉(除非是关机重启,但是可能因为磁盘正在写入,关机都关不了,只能拔电源)
4.T(stopped | tracing stop)暂停状态|调试状态
这是其中的两种状态
暂停状态 | 调试状态
kill -19 PID 暂停
kill -18 PID continue
T最典型的应用场景就是调试过程
5.Z(Zombie)僵尸状态
这个进程已经退出,但是还不允许被OS释放,处于一个被检测的状态,这就是僵尸状态
那么一个进程异常挂掉或者怎么怎么样到底谁来管他呢?
一般都是父进程或者操作系统,因为有时候父子进程都挂了,就只能操作系统去了
维持该状态,是为了让父进程和OS来回收,检测完了就把该进程从Z状态变为X,X才能被回收
表示的是失效了,不存在的
僵尸进程
僵尸状态是一个比较特殊的状态,当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程
僵尸进程会以终止状态X保持在进程表中,并且会一直在等待父进程读取退出状态代码
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程就进入Z状态。也就是说,子进程已经退出了,必须要把子进程相关数据检测完,数据读走,才能从Z---->X
僵尸进程的危害
1.进程的退出状态必须被维持下去,因为要告知父进程我的完成情况,父进程一直不读取,子进程就一直处于Z状态
2.维护退出状态,本身就是要用数据维护,也属于进程基本信息,所以要保存在task_struct当中,也就是说,Z状态一直不退出 ,PCB就一直要维护
3.一个父进程创建了很多子进程,就是不回收,那么就可能造成内存资源浪费的问题,因为数据结构对象本身就要占用内存----> 内存泄漏
6.X(dead)终止状态
该进程已死,准备回收
这个也很难看到状态,因为太快
孤儿进程
一般子进程的回收都是由父进程完成
那么父进程如果提前退出,那么子进程退出后,进入了Z状态之后,谁来处理?
父进程先退出,这样的子进程就叫做孤儿进程
孤儿进程被1号init进程领养,所以被init进程回收
状态之间的对应关系 和 kill
对应关系
1.退出状态就是Z(zombie)和X(dead)状态
需要先为zombie被检查之后变成dead才能够被回收
2.阻塞状态和挂起状态都是S
3.D深度睡眠和S可打断睡眠是等价的,只不过D不可被打断而已
关于kill
kill -l //查看kill信号
对于T状态(stop | trancing stop)
kill -19 KID 就是进程停止
kill -18 KID 就是continue
kill -9 KID 就是结束该进程
等等