进程状态是操作系统用来管理进程的一种手段,操作系统通过动态的调整进程状态来合理的分配资源,维护整个系统的生态。
// Linux内核对进程各个状态的定义,Linux系统的进程的状态不考虑/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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 */
};
通过指令 ps ajx 来查看当前运行的进程
进程状态的本质(代码层面)
在进程描述符里,有一个专门用来描述进程状态的变量,对进程状态修改的底层即为对这个变量的修改
#define R 0
#define S 1
#define D 2
#define T 4
#define t 8
struct task_struct{int stat;// ...
} void change_process_stat_Run(task_struct ts){ts.stat = Run;
}
R 状态
R 运行状态( running ) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
text.cc 代码如下
可以看到对应的程序为R状态(对于用户来说,R+ 就是优先级更高的 R 状态)
S 状态
S 睡眠状态( sleeping): 意味着进程在等待事件(如io)完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep ))
test.cc 代码
可以看到s状态
代码原理
T 状态
T 停止状态( stopped ): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
test.cc代码
SIGSTOP信号
通过 kill -l 查看全部信号
找到SIGSTOP 即19
指令: kill -19 进程id 再查看进程状态
可以看到T状态
t 状态
追踪状态,常用在调试,这个不演示了
D 状态
D 磁盘休眠状态( Disk sleep )有时候也叫不可中断睡眠状态( uninterruptible sleep) ,在这个状态的进程通常会等待IO 的结束。
作用:
当操作系统处理的数据过多导致内存打满,操作系统濒临崩溃时,为了保护全体整体的安全,此时操作系统会随机杀死一些处于sleep状态的进程,此时因为操作系统是随机杀的进程,对于使用方来说有一些是不太重要的,有一些比较重要需要对比较重要的进行保护,这是就可以把他设为D状态
举个例子,一个进程要向磁盘里写100G的文件,写到99G时,系统资源不够了,操作系统随机杀进程。这时就需要对这个下载进程进行保护
我的服务器配置不是很好,这个状态不太好检测
X 状态
X 死亡状态( dead ):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
这个状态只会在进程结束的一瞬间存在,不大好检测出来
Z 状态
僵尸状态,当子进程退出但父进程没有进行回收时出现
test.cc
感谢观看