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号进程接管)。

相关推荐
艾莉丝努力练剑1 小时前
【Linux网络】计算机网络入门:Socket编程预备,从字节序共识到 Socket 地址结构的“伪多态”设计
linux·服务器·网络·c++·学习·计算机网络
是烟花哈8 小时前
【前端】React框架学习
前端·学习·react.js
檀越剑指大厂8 小时前
32 万星的面试学习计划 + 内网穿透工具,程序员面试准备效率翻倍!
学习·面试·职场和发展
vortex58 小时前
Debian 包管理全指南:从底层 dpkg 到高层 apt 及其日志追踪
linux·运维·debian
Oll Correct9 小时前
实验二十一:验证OSPF可以划分区域
网络·笔记
偶尔上线经常挺尸9 小时前
《每日一命令08:scp——安全的远程复制》
linux·安全·scp·文件传输·运维基础·远程复制
计算机安禾9 小时前
【Linux从入门到精通】第17篇:日志系统——系统运行的黑匣子
linux·运维·服务器
l1t9 小时前
DeepSeek辅助解决windows 11 wsl2中Linux版Dbeaver显示中文
linux·运维·windows
YangYang9YangYan10 小时前
2026年工作后学习数据分析的价值与路径
学习·数据挖掘·数据分析
qeen8711 小时前
【数据结构】树的基本概念及存储
c语言·数据结构·c++·学习·