一、进程状态
Linux的进程状态实际上就是 struct task_struct 结构体中的一个变量
1.1状态汇总
其中,Linux 状态是用数组储存的,如下:
static const char * const task_state_array[] =
{
"R (running)", // 0
"S (sleeping)", // 1
"D (disk sleep)", // 2
"T (stopped)", // 4
"t (tracing stop)", // 8
"X (dead)", // 16
"Z (zombie)", // 32
};
R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成,进程在等待资源就绪。D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
1.2 睡眠状态
我们的 printf 是让代码输出到显示器上,而我们的CPU每次从内存中读取数据,我们查看实时进程时,进程每次都在SLEEP的原因是:CPU处理速度太快,导致我们每次查看时CPU都已经完成工作,等待下一次资源就绪!而我们都已经打印数十行却未观察到RUN状态,足以说明CPU运行速度之快。
睡眠状态还有一个是 [D] 状态,处于D状态下的进程处于深度睡眠,不可以被杀,不可中断睡眠
1.3暂停状态
记得之前我们聊了 [kill] 命令,我们现在来看看 [kill] 中的符号,我们先提个别,其他部分以后会讲
这里的19号符号 [SIGSTOP] 可以让我们的进程停下来,18号符号 [SIGCONT] 可以让暂停的进程重新跑起来。
[kill -19 [pid]] 可以暂停程序,我们通过之前的进程信息查询也可以看到进程的 status 处于 T 状态
此时出入代码[kill -18 [pid]] 即可让进程重新启动:
其实我们很早就接触过[暂停状态],当我们在VS下调试程序时,我们的断点就是让进程进入到了暂停状态。
二、僵尸进程[Z]
2.1概念
僵尸状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
我们未来会用 [waitpid] 命令读取僵尸进程,使用该命令时,僵尸进程就会由 [Z] 状态变为 [X] 状态,最后由操作系统释放。
我们之前说过 Linux 下使用的大部分执行操作,本质上都是运行进程,那我们使用过那么多命令,为什么没有产生过僵尸呢?
原因是直接在命令行中启动的进程,它们的父进程是 bash ,bash 会自动回收新进程的僵尸。
2.2弊端
1.如果父进程不读取子进程,那么子进程就一直处于Z状态
2.Z状态若一直不退出,那么储存它的PCB将一直被维护
3.如果父进程创建了很多子进程且不读取子进程,那么会造成内存资源浪费和内存泄露!
三、孤儿进程
子进程如果先退出,而父进程没有进行任何操作,那么子进程就会变成僵尸进程。
如果父进程先退出,子进程就称之为“孤儿进程”。
为了保证子进程正常被回收,孤儿进程一般都会被1号进程(又称 init 进程,即OS)所领养。
四、进程优先级
4.1基本概念
cpu资源分配的先后顺序,就是指进程的优先权。
优先权高的进程有优先执行权利。
还可以把进程运行到指定的CPU上,把不重要的进程安排到某个CPU,可以大大改善系统。
4.2查看系统进程
在 linux 系统中,用 [ps –l] 命令则会类似输出以下几个内容: