Linux进程管理---进程的状态(R,S,D,T,t,X,Z)

目录

1.进程状态的分类

2.R状态

(1)概念

(2)Linux下演示

3.S与D状态

(1)概念

(2)Linux下演示

4.T状态

(1)概念

(2)Linux下演示

5.t状态

(1)概念

(2)Linux下演示

6.X状态

7.Z状态

(1)概念

(2)Linux下的演示


1.进程状态的分类

R: 运行状态,并不意味着程序在运行种,它表明进程要么是在运行中,要么在运行队列里。

S:休眠状态,意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。

D:  磁盘休眠状态,有时候也叫做不可中断睡眠状态,在这个状态中进程通常会等待IO结束。

T:  停止状态,可以通过发送SIGSTOP信号来停止进程,这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。

X: 死亡状态,这个状态只是一个返回状态,你不会在列表中看到这个状态。

Z:僵尸状态,一种濒临死亡的状态。

2.R状态

(1)概念

R状态即为运行状态,在前面我们观察的进程的状态都是R状态。

只需要记住一点:

CPU在处理run_queue的时候,所有在排队的进程,都处于R状态的。因为他们是在排队进行,每一次时间片很短。

(2)Linux下演示

#include<stdio.h>    
int main()    
{    
  while(1);                                                                                                                      
}    

我们来写一个死循环的程序,保证程序一直在运行。运行它之后,打开另一个界面来查看进程:

此时我们发现它是一个R+状态,+表示在前台运行。

3.S与D状态

(1)概念

当我们完成某个任务的时候,任务条件不具备,需要进程进行某种等待。

在进程需要使用磁盘进行读写的时候,需要磁盘为其分配资源再由CPU对其进行读写,但如果磁盘并没有就绪,那么此时操作系统会将该想要调用磁盘资源的进程放在一个新的队列中,我们称之为等待队列。处于该队列的进程处于S状态。当磁盘空间就绪后,进程重新加入run_queue进入R状态。

千万不要以为进程只会等待CPU的资源,进程有可能因为运行需要,可能会在不同的队列中,在不同的队列所处的状态是不同的。

状态的本质是对进程的分类。

R与S之间的转换,产生了几个概念:

挂起等待:我们把运行状态的进程放到等待队列,称为进程的挂起等待(阻塞)。

唤醒进程:我们把等待队列中的进程放入运行队列,称为进程的唤醒。

S状态表示浅度睡眠,是可以由control+C来终止的。比如我们使用sleep函数让进程睡眠200s,就可以使用control+C来进行终止。

而下面要说的深度睡眠D是不可终止的。

当我们进程已经加载到CPU且磁盘已经就绪的时候,如果进程需要将信息写到磁盘上,我们知道外设的访问时间都较长,这个过程是需要时间的。因此进程还需要等待,此时操作系统发现这个进程在等待,如果将其干掉,显然是不合适的,因为,磁盘需要将读写成功与否的信息返回给该进程。这就是我们所说的深度睡眠,也就是D状态。处于D状态的进程是不能被control+C干掉的。

(2)Linux下演示

1 #include <stdio.h>
  2 int main()
  3 {
  4   while(1)
  5   {
  6     printf("test S process\n");                                                        
  7   }
  8   return 0;
  9 }

运行后我们发现处于S+状态,这是因为printf是对外设--显示器进行打印的,而显示器比较慢,等待其就绪是需要时间的,因此test大部分时间处于S+状态,只有少部分时间处于R状态。

4.T状态

(1)概念

程序处于暂停状态,此时信息没有任何更新,是完全的暂停。处于S状态的进程会有一些数据更新,比如睡眠了多少秒等。

(2)Linux下演示

我们可以使用

kill -l

指令来查看kill的命令:

其中我们第18号信号为进程的继续,第19号信号为进程的停止,我们可以拿之前的程序来进行测试:

当我们对test的进程码进行kill -19的操作时,进程停止了。

此时我们再对其进行kill-18操作:

此时我们发现进程继续执行。

但是此时我们发现我们通过control+C不能杀掉该进程了。

在进行进程搜索的时候我们发现:

之前处于S+状态的test现在处于了S状态。

此时程序再后台运行,只能通过kill -9来杀掉进程。

5.t状态

(1)概念

追踪状态,由我们控制程序一步一步执行,比如调试的过程。

(2)Linux下演示

  //测试t状态    
   int a=10;    
   printf("%d",&a);   

我们使用这段简单的代码来测试,并使其进入调试状态

此时我们发现gdb test和test分别处于S+和t状态,gdb test再等待键盘输入,test处于追踪状态。

6.X状态

死亡状态,CPU会进行资源回收,包括PCB和代码数据等。

X状态已经死亡,没法演示,但是我们可以演示Z状态。

7.Z状态

(1)概念

僵尸状态,即濒死状态。

为什么会有这一状态呢?因为进程死亡之前我们需要了解它是自然推出还是被OS或者其他程序干掉的。此时会产生进程退出的信息,并将其写入task_struct(PCB)中。

我们知道处于X状态的进程中的资源会被回收,回收者为该进程的父进程。如果还没有对其进行回收的话,那么此时该进程处于Z状态。因此我们可以通过这一点来进行演示Z状态的进程:

(2)Linux下的演示

我们可以先让父进程处于休眠的同时干掉子进程,此时子进程没有进行资源回收,处于Z状态。

如果我们再代码中干掉父进程呢?

else
  {
    printf("father do nothing\n");
    sleep(10);
    exit(-1);                                                                                   
  }               

此时我们会发现,只有子进程在运行,此时的子进程称为孤儿进程

此时我们发现,子进程还在执行,只不过它的父进程编程了pid为1的进程,那么这个1是谁呢?操作系统。

即操作系统会领养这个孤儿进程。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值