进程状态
进程状态有:就绪 / 运行 / 阻塞
linux下进程的状态
运行态 R:就绪以及正在运行,运行状态的进程才会被操作系统调度在cpu上运行
可中断休眠态 S:当前的阻塞能够被中断唤醒的休眠状态
不可中断休眠态 D:当前的阻塞不会被中断唤醒,等待条件满足自动唤醒
暂停态 T:停止运行,什么都不做
僵尸态 Z:进程已经退出了但是资源没有完全被释放的一种状态 (这是一种等待后续处理的状态)
可中断休眠状态展示S
loop.c代码
#include<stdio.h>
#include<unistd.h>
int main()
{
int a = 0;
sleep(5)
while (1)
{
++a;
}
return 0;
}
运行后查看进程状态pu -aux | grep loop
S表示的就是该进程处于可中断休眠状态
经过5秒后自动唤醒
暂停状态展示T
当你尝试杀死前面的那个进程,但是在查看进程信息时,该进程还是存在,但是是暂停状态。
运行状态展示R
loop.c代码
#include<stdio.h>
int main()
{
while (1)
{}
return 0;
}
运行后查看进程状态pu -aux | grep loop
僵尸状态展示Z
f.c代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid = fork();
while (1)
{
sleep(1);
printf("---child...pid:%d\n",getpid());
printf("---father...pid:%d\n",getpid());
}
return 0;
}
运行后查看进程状态ps -efl | head -n 1 && ps -efl | grep f
第一个是父进程,第二个是子进程。我们现在杀死子进程kill 4884
再查看进程状态ps -efl | head -n 1 && ps -efl | grep f
可以发现第二个的子进程已经是僵死状态
命令:
kill 进程号
杀死进程
kill -9 进程号
强制杀死进程
僵尸进程:处于僵死状态的进程,指的是进程已经退出不在运行,但是资源没有完全释放
僵尸进程产生的条件:子进程先于父进程退出,但是父进程没有进行进程等待,导致无法获取子进程的退出状态,因此操作系统无法直接释放子进程资源
资源没释放完是因为要保存僵尸进程的退出原因
僵尸进程的危害:资源泄漏(占据内存、进程数量等),一个用户所能创建的进程数量是有限的,并且资源没有完全回收,会占用内存资源。
处理僵尸进程的方法:
退出父进程(父进程退出,子进程保存退出原因就没有意义了)
避免僵尸进程的方法:
进程等待
孤儿进程:父进程先于子进程退出,则子进程称为孤儿进程,这孤儿进程的父进程成为了1号进程,并且这个孤儿进程运行在后台,并不占据前台终端。孤儿进程不会成为僵尸进程。
守护进程:是一种特殊的孤儿进程,父进程是1号(init)进程,运行在后台,与终端以及登录会话脱离关系,不再受影响。守护进程通常是一种运行在系统后台的批处理(默默的做一些循环往复的事情)
精灵进程:就是守护进程