Linux学习——进程状态

目录

一,进程状态

1,进程状态的分类

2.状态的本质

3.进程状态详解

1.运行状态

2.阻塞状态

3.挂起状态

4.Linux内核中的状态分类


一,进程状态

1,进程状态的分类

如下图:

在计算机中我们的状态的分类便如下图所示!但是我们在这篇博客里只讲三个状态:

1.运行状态,2.阻塞状态,3.挂起状态。

2.状态的本质

其实状态的本质便是在进程PCB里面存放的一个字段,这个字段的名称便是status。那就是说状态其实就是进程PCB里面的一个变量罢了!!!

3.进程状态详解

1.运行状态

在什么情况下进程的状态才能被改为运行状态呢?答案是当我们的进程被放入CPU的运行队列时!在这里补充一个知识点:每一个CPU在系统层面上都会维护一个运行队列!

2.阻塞状态

何为阻塞状态呢?所谓阻塞便是我们当前的进程需要等待!先补充一个小知识便是:在计算机中,我们的底层硬件都会维护一个dev waitqueue。何时会出现阻塞状态呢?比如说:

在运行某些进程时我们必然会有进行IO操作的时候,这个时候需要键盘等设备的输入。所以在我们的进程运行到要执行这些IO操作时我们的进程PCB会从运行队列里剥离出来而连接到dev维护的等待队列中。这个时候便出现了阻塞状态!

3.挂起状态

所谓挂起状态其实也是阻塞状态的一种。但是为什么又要叫做挂起状态呢?其实这是因为这种状态的出现是因为当我们的内存被占满的时,我们的操作系统便要开始清理空间,这时一些处于等待状态的PCB便被列入了清理对象的列表中,于是等待状态的进程PCB就要被写入到磁盘里,那么这个进程就被挂起了。它的状态也被叫做挂起状态了。

4.Linux内核中的状态分类

先来看看源代码:

cpp 复制代码
/*
* 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 */
};

首先便来看看第一个状态。现在直接教大家一个可以比较方便的查看状态的指令:

while :;do ps ajx | head -1&& ps ajx | grep "程序名" | grep -v grep ;sleep 1;done;(一定要记住要在while后面加上空格)

现在来写一个程序,代码如下:

cpp 复制代码
    #include<stdio.h>
    #include<unistd.h>

    int main()
    {
      while(1);                                                                            
      return 0;
    }      

查看状态如下:

可以看到这个程序执行时便是运行状态,这个状态便是R。

现在将代码改造如下:

cpp 复制代码
1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {
  5   while(1)
  6   {
  7     printf("I am a process!\n");//bin加上一个IO操作。                                  
  8     sleep(1);//加上一个sleep()操作。
  9   }
 10   return 0;
 11 }

接下来再来查看状态:

这里便成为了阻塞状态了,这个状态便是S。

第三个叫做D状态,这个状态我们一般是见不到的,如果被你见到了那你的计算机就离宕机不远了。这个D状态其实就是相当于一个免死金牌,当我们系统中的内存被占满时我们的操作系统便要开始杀进程了,但是某些进程可能在将自己的数据写入到磁盘中,此时这个进程便处于D状态,这时操作系统便不能杀死这个进程。

第四和第五个状态T与t都叫做停止状态,第一个T是在普通情况下的停止状态。这个状态只有在我们使用kill指令让我们的程序终止时才会出现。这个kill指令的编号时-19。所以这条命令便是kill -19 +pid。给一个运行的程序发送这条指令就会看到这个结果:

出现了T。

当我们的的程序在debug模式下运行时(在Makefile文件的gcc指令后面加上-g),如果再次使用这条语句便会出现一个t:

第四个状态叫做X状态,也就是死亡状态。当出现这个状态时,我们的进程便已经将任务完成了,于是这个进程便要将自己的PCB给销毁掉将空间还给操作系统。

第五个状态叫做Z状态,这个状态叫做僵尸状态。这个状态与死亡状态的区别在于这个进程已经结束了,但是它的PCB还没有被它的上一级进程回收。这样的进程便被叫做僵尸进程,与之相反的便是孤儿进程(孤儿进程便是当父进程结束,子进程还在运行时出现的一种状态,并且该子进程会被1号进程接管)。

相关推荐
210Brian1 天前
STM32学习笔记(七)TIM定时中断(上)
笔记·stm32·学习
我是小灰灰吖1 天前
Qt 6.9.3 Ubuntu 22.04 虚拟键盘显示问题全记录与解决方案
linux·qt·ubuntu
Mortalbreeze1 天前
深入理解TCP协议(一):TCP报文格式详解
linux·服务器·网络·tcp/ip
fasdgfgsdha56941 天前
西乡塘代理记账哪家好
笔记
三言老师1 天前
K8s 集群 LocalPV 静态 PV 资源手动创建实操
linux·运维·服务器·kubernetes
一直在努力学习的菜鸟1 天前
Rocky Linux 8.10 编译安装 PostgreSQL 17.11
linux·运维
海兰1 天前
【Kafka学习2】Apache Kafka 典型应用场景
学习·kafka·apache
Doraemomo1 天前
Linux编程-进程的执行和退出
linux·运维·服务器
Wang's Blog1 天前
PostgreSQL笔记19:进程与内存架构精解
笔记·postgresql·架构
边境悍匪1 天前
蜗牛学苑 Java 学习 Day23|SpringBoot 思维导图复盘
学习