【Linux操作系统】进程状态(1)

图片名称
🎉博主首页: 有趣的中国人

🎉专栏首页: Linux

🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构

在这里插入图片描述

小伙伴们大家好,本片文章将会讲解 Linux操作系统 进程状态 的相关内容。


如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长!

文章目录

  • `1. 进程状态介绍`
    • ==<font color = blue><b>🎧1.1 进程状态介绍🎧==
    • ==<font color = blue><b>🎧1.2 Linux OS 中的相关进程状态🎧==
    • ==<font color = blue><b>🎧1.2 Linux OS 进程状态示意图🎧==
  • `2. 详解 Linux OS 的进程状态`
    • ==<font color = blue><b>🎧2.1 S 状态 与 R 状态🎧==
    • ==<font color = blue><b>🎧2.2 T 状态🎧==
    • ==<font color = blue><b>🎧2.3 D 状态🎧==



1. 进程状态介绍


🎧1.1 进程状态介绍🎧


进程的状态指的是 操作系统对进程当前所处的情况或条件的描述。在操作系统中,进程可以处于不同的状态,这些状态反映了进程在其生命周期中的不同阶段或活动。

🎧1.2 Linux OS 中的相关进程状态🎧


/*
* 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 */
};


Linux OS 进程状态的相关解释:

  1. R 运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  2. S 睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  3. D 磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  4. T 停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  5. X 死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

🎧1.2 Linux OS 进程状态示意图🎧


在这里插入图片描述



2. 详解 Linux OS 的进程状态


🎧2.1 S 状态 与 R 状态🎧


C语言生成的可执行文件以及Linux相关的指令都是进程。在Linux系统中,任何可执行的程序都是以进程的形式在运行。当你在终端上输入一个命令时,例如ls(列出当前目录的文件),操作系统会创建一个新的进程来执行该命令。 同样,当你运行一个由C语言编写的可执行文件时,也会创建一个新的进程来执行该程序。


先看一下如下代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    while (1)
    {
        printf("I am a process,pid = %d\n",getpid());
    }
    return 0;
}

采用 gcc 生成可执行文件:
gcc -o testStatus testStatus.c

生成可执行文件示意图:

在这里插入图片描述

运行 testStatus 并用以下脚本代码查看进程:

while :; do ps ajx | head -1 && ps ajx | grep testStatus | grep -v grep; sleep 1; done 

查看进程状态示意图:

在这里插入图片描述

为什么这里会是 S 状态而不是 R 状态呢?

  1. 当我们在终端输入./testStatus的时候,操作系统会生成一个task_struct的结构体,并将代码和数据加载到内存中;
  2. 由于此代码中有printf()函数,需要访问外设;
  3. 在这个过程中,CPU不断将内存中的代码和数据放到寄存器中进行处理,处理完成之后再放回内存(冯诺依曼体系);
  4. 然而由于显示器的速度是非常慢的,因此CPU在等待显示器响应的时候可能会处于空闲状态,等待显示器资源的释放;
  5. 因此当CPU在等待外设资源的时候,Linux系统中的进程状态会被标记为“休眠”状态。

S 状态是可以被中断的:

通常情况下 S 状态是可以被kill指令终结的,所以 S 状态又叫可中断休眠状态。


kill 指令终结 S 状态示意图:

在这里插入图片描述


🎧2.2 T 状态🎧


T 状态表示一个进程被暂停执行, 通常是由父进程直接发起的暂停操作。例如 debug 状态下打断点调试代码就是常见的 T 状态。


生成debug文件:

[dsj@iZf8z7jm5hhjctr4l8jdkoZ lesson13.2]$ gcc -o testStatus.debug testStatus.c -g

用gdb进行调试:

[dsj@iZf8z7jm5hhjctr4l8jdkoZ lesson13.2]$ gdb testStatus.debug

打断点并运行:

(gdb) b 5
Breakpoint 1 at 0x4004f1: file testStatus.c, line 5.
(gdb) r
Starting program: /home/dsj/linux-coding/lesson13.2/testStatus.debug 

用以下脚本代码查看进程:

while :; do ps ajx | head -1 && ps ajx | grep testStatus | grep -v grep; sleep 1; done 

查看进程状态示意图:

在这里插入图片描述

也可以用kill指令手动让进程暂停或者继续运行,其中18号是让进程继续,19号是终止进程。

kill -l 查看所有信号:

在这里插入图片描述

🎧2.3 D 状态🎧


在Linux系统中, 当系统内存压力非常大时,操作系统有权利根据一定的策略选择杀死一些进程以释放内存空间,从而维持系统的稳定性和可用性。这种行为通常称为"内存压力控制"或"内存压缩",它是Linux内核中的一个重要特性之一。

但是有些进程正在等待硬盘、网络或其他设备的I/O操作完成,但是这些操作可能需要较长时间才能完成,而且在这期间进程无法被中断。


S 状态和 D 状态的区别:

虽然S状态和D状态都表示进程在等待外部事件发生,但它们之间的主要区别在于进程等待事件的特性以及操作系统对其的处理方式。

  1. S状态(休眠状态):
  • S状态表示进程正在等待某个事件发生,这个事件可能是等待I/O操作完成、等待信号量的释放、等待其他进程发送消息等。这种等待可能是可中断的,也就是说,如果进程收到了信号(如SIGKILL)或者等待的事件发生超时,操作系统可以中断等待状态,将进程唤醒并重新调度。
  • 在S状态下,进程通常在等待期间不会消耗系统资源(如CPU),而是被挂起,等待事件发生。
  1. D状态(不可中断的休眠状态,Linux OS 特有的状态):
  • D状态也表示进程在等待外部事件发生,通常是等待磁盘I/O操作完成。但是,D状态下的进程是不可中断的,即使接收到了信号(如SIGKILL),操作系统也无法中断进程的等待状态。这是为了确保在某些情况下系统的稳定性,例如当进程正在等待磁盘I/O操作完成时,需要确保这些操作完成后系统状态的一致性和完整性。
  • 进程处于D状态时,操作系统无法将其释放或终止,直到等待的事件发生并且进程完成相应的操作。

因此,尽管S状态和D状态都涉及等待外部事件发生,但操作系统对待它们的方式不同。S状态下的进程是可中断的,可以在需要时被操作系统释放或重新调度,而D状态下的进程是不可中断的,通常只有在等待的事件发生后才会被操作系统唤醒。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HDFS 之 DataNode 核心知识点

优质博文&#xff1a;IT-BLOG-CN 一、DataNode工作机制 DataNode工作机制&#xff0c;如下所示&#xff1a; 【1】一个数据块在 DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c…

Codeforces Round 951 (Div. 2)(A~C)

目录 A. Guess the Maximum B. XOR Sequences C. Earning on Bets 这次比赛也是打的稀碎了&#xff0c;第二个少个break检查了15分钟才检查出来&#xff0c;第三个符号搞错了&#xff0c;错了两次&#xff0c;道心直接破碎了 A. Guess the Maximum 题意&#xff1a;我们对…

计算机组成原理-cache详解

一、Cache的概念和原理 1、cache原理 2、cache性能分析 一道例题 3、cache和主存数据交换的单位 每次访问到的主存块会立即放入cache中 小结 二、cache和主存之间的映射关系 全相联映射 全相联访存过程 直接映射 组相联映射 小结 三、cache替换算法 在直接映射中&#xff0c…

webgl_framebuffer_texture

ThreeJS 官方案例学习&#xff08;webgl_framebuffer_texture&#xff09; 1.效果图 2.源码 <template><div><div id"container"></div><div id"selection"><div></div></div></div> </templa…

【sklearn】【逻辑回归1】

学习笔记来自&#xff1a; 所用的库和版本大家参考&#xff1a; Python 3.7.1Scikit-learn 0.20.1 Numpy 1.15.4, Pandas 0.23.4, Matplotlib 3.0.2, SciPy 1.1.0 1 概述 1.1 名为“回归”的分类器 在过去的四周中&#xff0c;我们接触了不少带“回归”二字的算法&#xf…

IDEA破解后的配置

以下所有操作都要求进入全局setting而不是某一个项目的setting 进入全局Setting File→close project 进入欢迎页面 低版本 然后点击Setting 关闭自动更新 不关闭有可能会破解失败 Appearance & Behavior->System Settings->Updates下取消Automatically chec…

k8s 对外服务之 Ingress(HTTPS/HTTP 代理访问 以及Nginx 进行 BasicAuth )

目录 一 Ingress HTTP 代理访问虚拟主机 &#xff08;一&#xff09;原理 &#xff08;二&#xff09;实验 1&#xff0c;准备 2&#xff0c;创建虚拟主机1资源 3&#xff0c;创建虚拟主机2资源 4&#xff0c;创建ingress资源 5&#xff0c;查看相关参数 6&#xff0…

ai写作工具哪些好用,分享4种ai智能写作软件

当我们踏入这个充满创意与无限可能的自媒体时代&#xff0c;ai写作工具就如同一盏盏闪耀的明灯&#xff0c;照亮我们的创作之路。那么&#xff0c;市面上的ai写作工具哪些好用呢&#xff1f;对于这个问题&#xff0c;今天&#xff0c;本文就带领大家一同揭开那神秘的面纱&#…

编译等底层知识

目录 一. GCC命令语句大全 二. GCC编译4个阶段 三. makefile的使用 四. CMake 五. GNU工具链开发流程图 六. Keil中的地址段 七. 静态库和动态库 一. GCC命令语句大全 -c只编译源文件&#xff0c;生成目标文件&#xff08;.o 文件&#xff09;&#xff0c;不进行链接。…

如何查询公网IP?

在互联网中&#xff0c;每个设备都有一个唯一的公网IP地址&#xff0c;用于标识设备在全球范围内的位置。查询公网IP是一个常见的需求&#xff0c;无论是用于远程访问、网络配置还是其他目的&#xff0c;了解自己的公网IP地址都是很有必要的。本文将介绍几种常见的方法来查询公…

Java并发编程中Future使用

Future类有什么用 Future类是异步思想的典型应用&#xff0c;主要用在一些需要执行耗时任务的场景&#xff0c;避免程序一直原地等待耗时任务完成&#xff0c;执行效率太低。具体来说&#xff1a;**当我们执行某一个耗时的任务时&#xff0c;可以将这个耗时任务交给一个子线程…

python3 -m http.server 检查打包前端的项目

python3 -m http.server这是 Python 提供的一个内置的简单 HTTP 服务器。当你在终端中运行 python3 -m http.server 命令时(在对应的打包目录比如dist目录)&#xff0c;Python 会启动一个 HTTP 服务器&#xff0c;它会将当前工作目录下的文件作为静态文件提供给浏览器。这个服务…

selenium非全新的方式同时启动多个浏览器又互不影响的一种实现方法,欢迎讨论!

最近在做模拟浏览器批量定时自动点击实现批量操作功能&#xff0c;主要使用selenium&#xff0c;但是发现selenium直接调用本地浏览器&#xff0c;启动的是一个全新的&#xff08;与手动打开的不一致&#xff09;&#xff0c;网站可以检测到&#xff0c;每次都要双重验证(密码登…

UnityXR Interaction Toolkit 如何使用XRHand手部识别

前言 Unity的XR Interaction Toolkit是一个强大的框架,允许开发者快速构建沉浸式的VR和AR体验。随着虚拟现实技术的发展,手部追踪成为了提升用户交互体验的关键技术之一。 本文将介绍如何在Unity中使用XR Interaction Toolkit实现手部识别功能。 准备工作 在开始之前,请…

论文阅读 A Distributional Framework for Data Valuation

本论文解决的问题 量化数据价值&#xff08;机器学习模型训练中各个数据点的贡献&#xff09; 避免数据价值受到其所处数据集的影响&#xff0c;使数据点的估值更加稳定、一致 变量假设 假设 D 表示一个在全集 Z 上的数据分布。对于监督学习问题&#xff0c;我们通常认为 Z…

RapidMiner数据挖掘4 —— 决策树

0. 序章 0.1 文本说明 所有应用程序操作的名称和编程说明都以黄色背景书写&#xff0c;问题以蓝色背景书写&#xff0c;以方便他们在文本中识别。 在整个课程中&#xff0c;请逐步遵循所有说明&#xff0c;并确保获得预期结果&#xff0c;然后再继续下一部分或问题。 通过在Ub…

Hadoop3:MapReduce源码解读之Map阶段的CombineFileInputFormat切片机制(4)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 6、CombineFileInputFormat原理解析 类的继承关系 与TextInputFormat切片机制的区别 框架默认的TextI…

api接口模块封装

1&#xff1a;前端封装接口 前端请求的统一封装也是为了方便前端项目的请求维护起来更加方便&#xff0c;将页面中的请求封装到js文件中&#xff0c;不同的页面需要用到相同的请求可以直接进行复用。 第一步创建一个api文件夹和js文件 第二步&#xff1a;在文件中导入axios&am…

精妙无比的App UI 风格

精妙无比的App UI 风格

springboot vue 开源 会员收银系统 (6) 收银台的搭建

前言 完整版演示 前面我们对会员系统 分类和商品的开发 完成了收银所需的基础信息 下面我们开始完成收银台的开发 简单画了一个收银的流程图大家参考下 从这张图我们可以分析一下几点 可以选择会员或散客收银选择会员使用相应的会员价结算使用会员卡则在价格基础根据卡折扣…