Linux操作系统~进程有哪些状态?

news2025/7/18 2:53:17

目录

R状态

 S/D状态

什么是D状态

T状态

X状态

 Z状态

什么是等待队列,什么是运行队列,什么是挂起/阻塞,什么叫唤醒进程

对比宏观上操作系统的三种状态


  

        从操作系统宏观的概念上讲,进程有三种状态,就绪态,运行态和阻塞态,进程初始化完成后进入就绪态,然后操作系统就会从就绪的进程中调度进程给CPU执行,在CPU中运行的进程就处于运行态,当时间片完后又会变成就绪态在运行队列里面等待CPU下次调度;如果在运行中的进程需要某种外设或某些资源但是无法满足时(比如发起IO请求),处于运行态的进程就会进入阻塞态,等到运行条件满足以后,变为就绪态等待系统调用。


 在Linux系统中,进程的状态有六种:R,S,D,T,X,Z

1.进程的状态信息在task_struct(PCB)里面

2.进程状态的意义:方便OS快速判断进程的状态,完成特定的功能,比如调度,本质是一种分类

R状态

  • R运行状态(running): 并不意味着进程一定在运行中(并不一定在使用CPU),它表明进程要么是在运行中要么在运行队列里

        让进程一直运行,通过ps指令查看当前进程的状态是R+,也就是运行状态(+表示处于前台的进程,如果我们想在后台运行进程./test6 &,这样在运行的时候加一个&即表示在后台)

#include <iostream>
using namespace std;
int main()
{
    while (1)
    {
        // cout << "running";
    }
    return 0;
}
[zebra@VM-8-12-centos cpp]$ ps -axj | head -1  && ps -axj | grep test6 | grep -v grep
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 3565  9911  9911  3565 pts/4     9911 R+    1001   3:56 ./test6

 S/D状态

  • 当我们完成某种任务的时候,任务条件不具备,需要进程进行某种等待,S/D
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep),也就是可以随时被终止,接收中断信号,是一种浅度睡眠,比如调用sleep函数,可以随时被终止)。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。(是一种深度睡眠,比如往磁盘中写数据,不可以随便终止进程,进程需要接受磁盘返回的信息

        进程等待用户输入的时候,会进入S状态

#include <iostream>
using namespace std;
int main()
{
    int t;
    while (1)
    {
        cin >> t;
    }
    return 0;
}
[zebra@VM-8-12-centos cpp]$ ps -axj | head -1  && ps -axj | grep test6 | grep -v grep
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 3565 11425 11425  3565 pts/4    11425 S+    1001   0:00 ./test6

什么是D状态

        D状态是一种不可中断的睡眠状态。比如一个进程让磁盘你帮我写1G数据到磁盘里面去,磁盘开始忙了,进程就会进入D状态等待磁盘写入完成(因为这种等待状态是不允许被中断的,因为如果中断进程的等待,磁盘写入数据完成后,无法向原来的进程返回错误/正确信息,会导致一些问题)

D状态就是深度睡眠,处于这种状态的进程不能被中断的(不可以被杀掉)

        进程在内核中某些不能被信号打断,例如对某些硬件设备进行操作时刻(等待磁盘Io,等待网络io等等)。

        进程处于D状态一般情况下很短暂不应该被top或者ps看到。

        如果进程在top和ps看到长期处于D状态,那么可能进程在等待IO时出现了问题导致进程一直等待不到IO资源,此时如果要处理掉这个D进程,那么只能重启整个系统才会恢复。因为此时整个进程无法被kill 掉


T状态

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

        处于S状态的进程里面的数据可能会被更新,然后唤醒,处于T状态的进程是一种暂停状态,是彻底暂停了,也不会对其里面的一些数据进程更新。


X状态

  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。表示进程彻底结束了,可以回收进程资源了(相关的数据结构+代码和数据),变成X状态后,这个进程几乎瞬间就会被清理掉,所以很难捕捉到处于这个状态下的进程。

 Z状态

  • Z僵尸状态(zombie):表示一个进程即将死亡的状态,此时可以保存进程退出的信息(比如进程为什么要退出),保存在task_struct里面

        所以当一个要进程退出的时候,会先进入Z僵尸状态,将进程的退出信息保存在task_struct里面,供父进程或者操作系统读取该信息,之后才会进入X死亡状态。

  1. 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用读取)没有读取到子进程退出的返回代码时,子进程就是僵尸进程(处于僵尸状态)
  2. 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
  3. 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
  4. 处于僵尸状态的进程叫做僵尸进程

        模拟子进程执行结束,父进程还没有结束的情况,此时子进程会变成僵尸进程,也就是处于Z状态。(后5s)

#include <iostream>
#include <cstdlib>
#include <unistd.h>
using namespace std;
int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        // 子进程
        cout << "这是子进程" << endl;
        sleep(5);
    }
    else if (id > 0)
    {
        // 父进程
        cout << "这是父进程" << endl;
        sleep(10)
    }
    else
    {
        //执行出错
        exit(-1);
        sleep(10);
    }

}
[zebra@VM-8-12-centos cpp]$ while :; do ps -axj | head -1  && ps -axj | grep test6 | grep -v grep; sleep 1; echo "============================================================="; done
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 Z+    1001   0:00 [test6] <defunct>
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 Z+    1001   0:00 [test6] <defunct>
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 Z+    1001   0:00 [test6] <defunct>
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 Z+    1001   0:00 [test6] <defunct>
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 4932  5670  5670  4932 pts/0     5670 S+    1001   0:00 ./test6
 5670  5671  5670  4932 pts/0     5670 Z+    1001   0:00 [test6] <defunct>
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
=============================================================
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
=============================================================

 


什么是等待队列,什么是运行队列,什么是挂起/阻塞,什么叫唤醒进程

        我们把从运行状态的task_struct(run_queue),放到等待队列中,就叫做挂起等待(阻塞)从等待队列,放到运行队列,被CPU调度就叫做唤醒进程

        当一个进程在运行的过程中,由于其某些运行条件还没就绪(比如要网络但是网卡了,或者需要等待IO,也就是需要使用外设了),就会被放到等待队列中,并且task_struct里面的状态位也会被改变为S/D。

当进程处于S/D状态的时候,在一个等待队列里面等着使用外设(比如网卡,磁盘显示器等)

等CPU的队列叫做运行队列,等外设的设备叫做等待队列

所谓的进程,在运行的时候,有可能因为运行需要,可以会在不同的队列里

在不同的队列里,所处的状态是不一样的

        当一个进程在R状态的时候,如果需要某种外设,但是外设在被使用,我就把你的状态变成S/D,然后把你的task_struct放到等待队列里面去

对比宏观上操作系统的三种状态

        就绪态/运行态就是R状态,停止对应的就是X/Z状态,阻塞态对应的就是S/D/T状态(T状态很少使用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试和测试自动化你分的清楚吗?

目录 前言 两种自动化测试 为什么测试自动化对连续测试至关重要 使测试自动化成为现实 拥抱连续测试 总结 重点&#xff1a;配套学习资料和视频教学 前言 当我们谈论持续测试&#xff0c;以及持续交付和DevOps时&#xff0c;“自动化”一词就泛滥了。从根本上讲&#xf…

ES6之对象解构

对象和数组字面量是JavaScript中两种最常用的数据结构&#xff0c;由于JSON数据格式的普及&#xff0c;二者已经成为语言中最重要的一部分。在代码中&#xff0c;我们经常定义很多对象和数组&#xff0c;然后从去提取相关的信息片段&#xff0c;ES6为简化这种任务引入了新特性&…

猿代码浅谈MPI与OpenMP并行程序设计

一、什么是OpenMP&#xff1f; OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括&#xff1a;C语言、C、Fortran;不过&#xff0c;用以上这些语言进行程序开发时&#xff0c;并非需要特别…

一文读懂qt界面设计(分裂器,布局,拉伸,各种属性设置)

可以先看看我这个文章&#xff1a;qt关于界面设计中的一些知识总结_我是标同学的博客-CSDN博客_qt 水平伸展 现在我们来正式开始讲解。 布局种类 qt中能称为布局管理器的有如下6个&#xff1a; 水平布局&#xff08;QHBoxLayout&#xff09;垂直布局&#xff08;QVBoxLayout…

数字电路基础04(查找表LUT)

文章目录 LUT(Look Up Table)为什么要用LUT?示例(3输入LUT)LUT(Look Up Table) 在FPGA中,利用LUT来实现组合逻辑的功能,将组合逻辑的输入输出结果,存储为真值表的形式,来代替传统的由逻辑门组成的组合逻辑电路LUT就是将组合逻辑转换成真值表LUT实际上是将输入数据作…

怎么清理c盘的垃圾文件?有什么好的清理方法推荐?

在使用电脑办公或者娱乐的时候&#xff0c;我们的电脑会产生很多临时文件&#xff0c;如果这些临时文件不被清理掉的话&#xff0c;就会导致电脑的运行速度越来越慢&#xff0c;为了能够让电脑的速度越来越快&#xff0c;很多人都会想要清理C盘&#xff0c;但是在清理C盘的时候…

机器视觉(三):摄像机标定技术

目录&#xff1a; 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 &#x1f30f;&#x1f9d0;以下为正文&#x1f984;&#x1fa90; 摄像机标定的目的&#xff1a;三维重建 空间物体表面…

ESP32使用MiroPython编程环境搭建

大家好&#xff01; 今天和大家聊一聊ESP32使用MrioPython编程的环境搭建过程。 目录 一、在ESP32上使用MiroPython的必要条件 二、安装Thonny 1.安装地址 2.安装过程 三、下载MiroPython 四、下载ESP32驱动 五、烧录MicroPython到ESP32 六、点亮ESP32设备LED灯 一、在…

无人机技术服务应用

无人机技术服务应用 随着无人机的迅速发展&#xff0c;无人机行业应用越来越丰富&#xff0c;如何实现无人机行业内高效的运营一直是我们关注的重点。当今无人机具有的优势很多&#xff0c;例如&#xff1a;携带方便、操作简单、反应迅速、载荷丰富、任务用途广泛、起飞降落对…

计算机网络【HTTP协议】

计算机网络【HTTP协议】&#x1f34e;一.HTTP协议概述&#x1f352;1.什么是HTTP协议&#x1f352;1.2 Fiddler&#xff08;抓包工具&#xff09;&#x1f34e;二.HTTP协议格式&#x1f352;2.1HTTP请求&#x1f349;2.1.1 HTTP请求格式&#x1f349;2.1.2 HTTP请求格式URL&…

语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、路径覆盖

白盒测试的测试用例在大二学习软件工程的时候也是一个重点模块&#xff0c;但是上课没有太多时间做太多的测试用例&#xff0c;然后许久不用会搞乱&#xff0c;所以这里简单复盘一下。 白盒测试是结构测试&#xff0c;主要对代码的逻辑进行验证。 逻辑覆盖率&#xff1a;语句覆…

软件推荐:AList

软件推荐&#xff1a;AList AList是一个开源Web服务&#xff0c;可以添加多种网盘&#xff0c;将你的多个网盘应用集成到一个统一应用中使用&#xff0c;并且还支持通过WebDAV服务映射到操作系统本地目录使用。 GitHub&#xff1a;https://github.com/alist-org/alist 安装 …

双十一买什么比较划算?四款实用性超强不吃灰的数码好物推荐

现如今&#xff0c;越来越多的数码产品逐渐融入我们的生活当中。但是&#xff0c;在众多的数码产品中&#xff0c;很多人买来用过一两次就放着吃灰的产品也不在少数。因此&#xff0c;我来给大家推荐几款实用性强、不吃灰的数码好物&#xff0c;一起来看看吧。 一、南卡小音舱…

面试算法题

文章目录数组中的第K个最大元素快排k个一组反转链表解法一&#xff1a;栈解法二&#xff1a;模拟买卖股票最佳时机买卖股票最佳时机i买卖股票最佳时机ii贪心无重复长度子串最长递增子序列只出现一次的数字 IIIlru缓存合并K个升序链表数组中的第K个最大元素 快排 class Solutio…

第一个程序

第一个程序 1. 常用DOS命令 1.1 打开命令提示符窗口 1. winR2. cmd3. 按下回车键 1.2 常用命令 2. Path 环境变量的配置 2.1 为什么要配置 Path环境变量 开发 Java程序&#xff0c; 需要使用 JDK 提供的开发工具&#xff0c; 而这些工具在 JDK 的 安装目录的 bin目录 下。未来…

【测试代码 基于Pytorch】的卷积神经网络(CNN) || 【基于Pytorch】的深度卷积神经网络(DCNN)

声明:仅学习使用~ 目录 一、卷积神经网络 CNN1、【基于Pytorch】的卷积神经网络(CNN)2、【基于Pytorch】的深度卷积神经网络(DCNN)一、卷积神经网络 CNN CNN,这里以 LeNet 为例。LeNet神经网络由深度学习三巨头之一的Yan LeCun提出,他同时也是卷积神经网络 (CNN,Convo…

RHCE之路配置本地DNS服务器的正反向解析

第十天 SOA格式 ---&#xff08;序列号&#xff0c;同步时间&#xff0c;重试时间&#xff0c;过期时间&#xff0c;TTL&#xff09; 正向解析 [roota ~]# mount /dev/sr0 /mnt mount: /mnt: WARNING: device write-protected, mounted read-only. [roota ~]# yum install bin…

Java 8 新特性 ---- Lambda 表达式

Java 8 新特性 ---- Lambda 表达式1. Java7与Java8的区别2. Lambda表达式3. 语法4. Lambda 表达式实例5. 变量作用域1. Java7与Java8的区别 // 使用 java 7 排序private void sortUsingJava7(List<String> names){ Collections.sort(names, new Comparator<String&g…

matplotlib中的pyplot实用详解

matplotlib中的pyplot实用详解示例1&#xff1a;使用axes确定子图的位置相关函数详解1、plt.subplot()2、plt.subplots_adjust() 与 plt.axes()来控制子图的位置示例1&#xff1a;使用axes确定子图的位置 import matplotlib.pyplot as plt import numpy as np# 固定随机种子 np…

Typescript 学习笔记(二)高级类型二

交叉类型 交叉类型&#xff08;&&#xff09;&#xff1a;功能类似于接口继承&#xff08;extends&#xff09;&#xff0c;用于组合多个类型为一个类型&#xff08;常用于对象类型&#xff09; interface Person2 {name: string} interface Contact {phone: number} typ…