【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状态下的进程是不可中断的,通常只有在等待的事件发生后才会被操作系统唤醒。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钓鱼攻击的隐性经济

近年来&#xff0c;网络钓鱼形势发生了重大变化&#xff0c;涵盖了各种类型的攻击。许多公司已经开发了分类法来对不同的网络钓鱼攻击进行分类&#xff0c;类似于BlueVoyant 提出的分类法。该分类法概述了几种类型的网络钓鱼攻击&#xff0c;例如&#xff1a; 1. 电子邮件钓鱼…

无线和移动网络

背景 两个重要的挑战 无线&#xff1a;通过无线链路通信移动&#xff1a;需要网络处理移动&#xff08;不同变换所接入的网络&#xff09;用户 无线网络中的组件 无线主机&#xff08;无线并不总是意味着移动的&#xff09;基站&#xff08;base station 或者叫AP&#xff0…

旭日X3与英伟达Orin NX通过TCP传输图片

观前提醒&#xff1a;本文主要内容为使用Python在局域网内建立TCP连接并传输图片信息&#xff0c;计算机为一块旭日X3和一块英伟达Orin NX。 一、什么是TCP TCP&#xff08;传输控制协议&#xff09;是一种可靠的、面向连接的协议&#xff0c;它确保数据包的顺序传输和完整性…

计算机组成结构—多处理器

目录 一、SISD、SIMD、MIMD 和向量处理器 1. 费林分类法 2. SIMD 和向量处理器 二、硬件多线程 三、多核处理器和 SMP 1. 多核处理器 2. 共享内存多处理器&#xff08;SMP&#xff09; 3. MPP 和集群 一、SISD、SIMD、MIMD 和向量处理器 通过改进系统结构&#xff0c;可…

java:reactor的Mono和Reactor的简单例子

【pom.xml】 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.3.17.RELEASE</version> </dependency>【MyReactorTest2.java】 package com.chz.myReactor;import react…

十年数据分析经验分享

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

WPF入门--多种方式设置样式(Style)

前言 在上篇文章中&#xff0c;介绍了WPF九种布局方式。本篇文章通过多种方式设置样式&#xff08;Style&#xff09;以控制UI元素的外观和行为。下面来具体介绍一下。 传送门 WPF入门--常用布局方式 目录 前言 一、直接在XAML中设置属性&#xff08;内联样式&#xff09…

【蓝桥杯2025备赛】分巧克力

【蓝桥杯2025备赛】分巧克力 [蓝桥杯 2017 省 AB] 分巧克力 题目描述 儿童节那天有 K K K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N N N 块巧克力&#xff0c;其中第 i i i 块是 H i W i H_i \times W_i Hi​Wi​ 的方格组成的长方形…

C++ | Leetcode C++题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; class Solution { public:int candy(vector<int>& ratings) {int n ratings.size();int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < n; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] rati…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…

计算机网络 —— 数据链路层(以太网)

计算机网络 —— 数据链路层&#xff08;以太网&#xff09; 什么是以太网以太网传输介质和拓扑结构的发展传输介质的发展&#xff1a;拓扑结构的发展&#xff1a; 10BASE-T 以太网适配器和MAC地址适配器&#xff08;Adapter&#xff09;MAC地址适配器与MAC地址的关系 MAC帧以太…

GLM-4-9B领先!伯克利函数调用榜单BFCL的Function Calling评测方法解析与梳理

智谱公布的GLM-4-9B基于BFCL榜单的工具调用能力测试结果 ©作者|格林 来源|神州问学 在智谱最新开源的GLM-4-9B-Chat中&#xff0c;其工具调用能力在BFCL&#xff08;伯克利函数调用排行榜&#xff09;榜上获得了超高的总BFCL分&#xff0c;和gpt-4-turbo-2024-04-09几乎不…

举个栗子!Quick BI 技巧(8):柱形图的制作及应用

众所周知&#xff0c;在数据分析中&#xff0c;柱形图是利用率非常高的一种图&#xff0c;主要是用于比较各组数据之间的差别&#xff0c;并且可以显示一段时间内的数据变化情况。那么在 Quick BI 中要如何来制作柱形图呢&#xff1f; 今天的栗子&#xff0c;我们就来分享如何…

网关鉴权模块-鉴权+登录拦截+jwt

1. 鉴权流程 浏览器发送请求时。请求头会携带键值对"authorization"&#xff1a;jwt 网关先解析jwt令牌&#xff0c;做第一次鉴权&#xff0c;鉴权完成后将解析的user对象的id添加到请求头中&#xff1a;user-info 用户id&#xff1b; 微服务的拦截器会获取请求头中…

spring boot2.7.x遇到问题

validation报错 高版本已移除了validation以来&#xff0c;需手动添加 <dependency><groupId>jakarta.validation</groupId><artifactId>jakarta.validation-api</artifactId> </dependency>mybatis报错 升级版本 <dependency>&…

基础篇01——SQL的基本语法和分类

MySQL数据库安装与基本使用 安装教程参见&#xff1a;通过zip安装MySQL 通过命令行启动和停止MySQL服务命令 前提&#xff1a;安装MySQL成功之后 启动服务&#xff1a;net start mysql 停止服务&#xff1a;net stop mysql 通过命令行连接mysql 可以通过mysql的客户端命令行…

记录某书请求返回406及响应{“code“:-1,“success“:false}

今天测试某个平台的爬虫时使用requests post请求正常写了个测试脚本把各种参数带上出来以后出现了406情况&#xff0c;和网站数据是完全一样的 以为是 X-S、X-T参接不对&#xff0c;但在postman里测试又是可以的成功&#xff0c;以为是检验了参数顺序&#xff0c;测试发现也没…

SQLAlchemy 模型中数据的错误表示

1. 问题背景 在使用 SQLAlchemy 0.6.0 版本&#xff08;也曾尝试使用 0.6.4 版本&#xff09;的 Pylons 应用程序中遇到了一个 SQLAlchemy ORM 问题。该问题出现在使用 psycopg2 作为数据库驱动程序、连接至 Postgresql 8.2 数据库的环境中。定义了一个 User 模型对象&#xf…

封装了一个仿照抖音评论轮播效果的iOS轮播视图

效果图 原理 就是我们在一个视图里面有两个子视图&#xff0c;一个是currentView, 一个是willShowView,在一次动画过程中&#xff0c;我们改变current View的frame&#xff0c;同时改变willShowView的frame&#xff0c;同时&#xff0c;需要改变currentVIew 的transform.y不然…

Linux操作系统:Redis在虚拟环境下的安装与部署

Redis下载方法 最近部署项目的时候用到了Redis&#xff0c;自己在安装的时候也碰到了一些列问题最终安装成功&#xff0c;记录一下自己的安装历程。前期准备&#xff1a; 服务器Linux版本&#xff1a;Centos8.4 64位&#xff08;http://isoredirect.centos.org/centos/8/isos/…