[Linux][进程][进程的七种状态]

发布于:2024-10-13 ⋅ 阅读:(130) ⋅ 点赞:(0)

进程状态是操作系统用来管理进程的一种手段,操作系统通过动态的调整进程状态来合理的分配资源,维护整个系统的生态。

// 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

感谢观看


网站公告

今日签到

点亮在社区的每一天
去签到