【Linux】进程状态(R运行状态、S睡眠状态、D磁盘休眠状态、T停止状态、X死亡状态)

        

目录

01.运行状态

02.睡眠状态

03.磁盘睡眠状态

04.停止状态

05.死亡状态


        进程的状态会随着操作系统的调度和外部事件的发生而不断地发生转换。例如,一个新创建的进程经过初始化后会进入就绪态,等待被调度执行;当调度器分配处理器资源给进程时,进程进入运行态;如果进程发起了I/O操作,它可能会进入阻塞态等待I/O完成;当I/O完成后,它重新回到就绪态等待再次执行;当进程执行完毕或被终止时,进程进入终止态

        进程状态的合理转换是操作系统正常运行的基础,也是实现多任务并发的关键。下面我们来理解进程的各个运行状态。以下是总览:

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

01.运行状态

在理解进程状态时,首先要理解下面几个概念:

操作系统调度机制

操作系统负责计算机软硬件资源管理,其主要任务之一是有效地调度多个进程,以便它们能够并发执行在多任务处理中,有多个进程需要与处理器进行交互,但处理器一次只能执行一个进程的指令,因此操作系统需要有一种机制来管理这些进程的执行,以便它们可以在处理器上轮流运行。运行队列就是这样的一种机制。

运行队列

运行队列是操作系统内核中的一个数据结构,用于存储处于就绪态的进程,即哪些已经准备好执行但尚未获得处理器的进程。其通常是一个先进先出队列,其中进程按照加入就绪态的顺序排列。

时间片

每个进程在处理器上的执行时间是多少呢,此时就要引入一个时间片的概念,时间片代表了每个进程在处理器上连续执行的时间。通过将处理器的执行时间分割成小的时间片段,操作系统可以轮流地为每个就绪态的进程分配处理器时间,从而实现多任务并发执行。

注意:在一般情况下,只有处于就绪态的进程才会被放入运行队列并被分配时间片,当进程编程阻塞态时就会被移出运行队列,不过在一些复杂的情况下有可能会被移到某种阻塞队列中等待资源可用。

当进程由运行队列被放到处理器中时,就有了运行态,处理器为其分配时间片,使其能够在规定的时间内执行指令,处理任务。这种状态下的进程可能会在一段时间后被操作系统挂起,以便为其他进程腾出空间。

进程挂起

进程挂起是指将一个正在运行的进程暂时停止执行,使其暂时不占用处理器资源。这种操作可以通过操作系统的特定调用或信号来实现。当一个进程被挂起时,它的执行状态被保存,以便稍后可以恢复执行。在进程被挂起期间,操作系统可能会将处理器分配给其他就绪态的进程,以实现多任务处理。

挂起进程与阻塞进程不同,因为阻塞进程通常是由于等待某些事件而无法继续执行,而挂起进程是由操作系统或用户显式地将其暂停执行。

02.睡眠状态

当进程处于睡眠状态时,它暂时不需要处理器资源,因为它在等待某些事件的发生。睡眠状态的进程可能在等待I/O操作完成、等待信号量、等待定时器等。一旦等待的事件发生,进程就会被唤醒并切换到就绪态。

下面用代码来演示进程从睡眠状态到就绪状态再到运行状态的过程:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {pid_t pid = fork(); // 创建子进程if (pid < 0) {// 创建进程失败perror("fork failed");exit(1);} else if (pid == 0) {// 子进程代码printf("子进程睡着了...\n");sleep(5); // 子进程睡眠5秒printf("子进程醒了!\n");exit(0); // 子进程结束} else {// 父进程代码printf("父进程在等子进程结束...\n");wait(NULL); // 父进程等待子进程结束printf("父进程开始运行了...\n");}return 0;
}

在这个示例中:

  1. 父进程调用 fork() 创建子进程。
  2. 子进程进入睡眠状态,睡眠5秒钟。
  3. 在子进程睡眠期间,它处于睡眠状态,不占用处理器资源。
  4. 当5秒钟过去后,子进程被唤醒,结束睡眠状态,并转换为就绪态。
  5. 父进程调用 wait() 等待子进程结束。
  6. 子进程结束后,父进程继续执行。

03.磁盘睡眠状态

进程处于磁盘睡眠状态时,它正在等待磁盘I/O操作完成。这种状态通常在进程需要大量磁盘读写操作时出现,例如,文件系统操作、数据库操作等。

磁盘睡眠状态和睡眠状态都表示进程暂时无法执行,但磁盘睡眠状态特指等待磁盘 I/O 操作完成的情况,而睡眠状态则是一个更广泛的概念,包括等待各种不同类型事件发生的情况。

04.停止状态

T (stopped)和t (tracing stop)统称为停止状态。

T (stopped): 进程被停止时,它暂时停止执行指令,但仍然保留在系统中。这种状态通常由调试器暂停、SIGSTOP信号等触发。停止状态的进程可以被重新启动,继续执行。

t (tracing stop): 进程被追踪暂停时,通常是为了调试目的。在这种状态下,调试器可以查看进程的内部状态、寄存器值等,以帮助排查程序问题。

下面是一个简单的示例,说明进程被停止的情况:

假设有一个简单的 C 程序,如下所示:

#include<stdio.h>
#include<unistd.h>int main()
{while(1){printf("我是一个进程...\n");sleep(1);}return 0;
}

在这个程序中,进程将不断打印消息,模拟持续执行。

然后,可以使用gdb调试器在程序运行过程中停止该进程:

$ gcc -g -o proc proc.c
$ gdb proc
(gdb) run

然后,在另一个终端中,找到该进程的进程 ID(PID)并发送 SIGSTOP 信号来停止它:

kill -STOP 66414

先前的终端显示以下信息表示进程被停止: 

尽管进程暂时停止执行指令,但它仍存在于系统中,可以通过调试器重新启动或进行其他操作。

05.死亡状态

 死亡状态通常指的是进程已经终止执行并退出,但其相关的进程描述信息仍然保留在系统中,直到其父进程对其进行清理。

进程终止

进程终止是指进程执行完毕或者由于某种错误导致其异常终止。在进程终止时,它的执行环境、资源和内存空间会被操作系统回收和释放。

僵尸进程

当一个进程终止后,其父进程需要调用 wait()waitpid() 等系统调用来获取子进程的退出状态,否则子进程的进程描述信息会被保留在系统中,形成僵尸进程。僵尸进程不再执行任何操作,但其相关的进程描述信息(如进程 ID、退出状态等)仍然存在于系统的进程表中。

清理僵尸进程

父进程应当定期调用 wait()waitpid() 等系统调用来清理僵尸进程,从而释放相关的进程描述信息,防止系统资源的浪费。如果父进程长时间不清理僵尸进程,那么系统可能会耗尽进程表项,导致无法创建新的进程。

处理僵尸进程

父进程可以通过 wait()waitpid() 等系统调用来处理僵尸进程,获取子进程的退出状态并释放相关的资源。这样做可以确保系统中不会出现大量僵尸进程,保持系统资源的有效利用。

以上就是进程状态的有关知识了,欢迎评论区留言,觉得俺的博客对你有帮助的,可以点赞关注支持一波喔~😉

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

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

相关文章

Windows直接运行python程序

Windows直接运行python程序 一、新建bat脚本二、新建vbs脚本 一、新建bat脚本 新建bat批处理脚本&#xff0c;写入以下内容 echo off call conda activate pytorch python app.pyecho off&#xff1a;在此语句后所有运行的命令都不显示命令行本身&#xff0c;但是本身的指令是…

Android: Gradle 命令

一、查看整个项目依赖传递关系 x.x.x (*) 该依赖已经有了&#xff0c;将不再重复依赖。x.x.x -> x.x.x 该依赖的版本被箭头所指的版本代替。x.x.x -> x.x.x(*) 该依赖的版本被箭头所指的版本代替&#xff0c;并且该依赖已经有了&#xff0c;不再重复依赖。 1. gradlew ap…

申请即管控、差补自动算......企业差旅,想怎么省就怎么省

3月开始,企业商旅行为逐步升温。但管控难度也随之而来: ● 同时段、同起终地,预订机、火。企业支付后,总忘记取消未使用行程; ● 同天预订不同城市酒店,非入住酒店经常无法免费取消; ● 短途差旅,依然按习惯预订机票...... 为了提高效率,“出一趟差,办多项事”成了很多企业…

隐语笔记2 —— 隐私计算开源如何助力数据要素流通

数据生命周期 数据流转链路主要包括&#xff1a;采集、存储、加工、使用、提供、传输 数据要素外循环是构建数据要素市场的核心 数据外循环中的信任焦虑 三个代表性问题&#xff1a; 不可信内部人员不按约定使用用户隐私泄漏 数据权属问题 解决方案&#xff1a;从主体信任…

耳目一新的滑块版登录注册界面~

又到了毕业季&#xff0c;大家做毕设的时候总会参考已有的案例&#xff0c;不过大多产品的样式非常单一雷同。本帖博主给大家分享一个比较别树一帜的登录界面&#xff0c;如下&#xff1a; 如果没有账号&#xff0c;点击“去注册”&#xff0c;则会产生如下的效果&#xff1a; …

金融投贷通(金融投资+贷款通)项目准备

金融投贷通&#xff08;金融投资贷款通&#xff09;项目准备 专业术语投资专业术语本息专业术语还款专业术语项目介绍三个子系统技术架构核心流程发布借款标投资业务 项目实施测试流程测试步骤 专业术语 投资专业术语 案例&#xff1a;张三借给李四5W&#xff0c;约定期满1年后…

特斯拉铺路 小米SU7稳了

文 | AUTO芯球 作者 | 李逵 我把特斯拉的销售拉黑了 拉完又后悔了 因为我欠他一个人情啊 具体怎么回事 看完你就会明白了 今天一大早 特斯拉的销售就发信息给我 说从4月1号开始 特斯拉就要涨价了 我以前去看的Model Y 要提价5000块 而且之前的补贴 什么保险补贴、…

844. 走迷宫 典bfs

AC代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cmath> using namespace std; const int N 110;int mp[N][N]; int sx,sy; bool vis[N][N]; struct node{i…

TCP重传机制详解——02SACK

文章目录 TCP重传机制详解——02 SACKSACK是什么&#xff1f;为什么要有SACK&#xff1f;实际场景抓包具体显示信息流程 实战抓包讲解SACK关闭场景下&#xff0c;三次重复ACK后会快速重传SACK打开但是不携带SACK块信息场景下&#xff0c;三次重复ACK也不会快速重传SACK打开并且…

mysql分页查询多用GitCode平台

目录 一、在GitCode平台AI搜索结果&#xff08;这个更优&#xff09; 二、在百度搜索输入“mysql Java分页查询”的输出结果&#xff1a; 三、推荐的文章 四、GitCode的使用 1&#xff09;如搜索jdk11可以直接下载jdk11的包 2&#xff09;搜索开源项目 3&#xff09;如搜…

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径

修改Jupyter Notebook的默认路径&#xff0c;以及在PowerShell中自定义其启动路径 设置 Jupyter Notebook 配置文件&#xff0c;修改默认路径要在PowerShell中设置自定义的启动脚本&#xff0c;以确保Jupyter Notebook能够自动定位到当前路径设置后的效果 在使用Jupyter Notebo…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

37、Linux中Xsync数据同步备份工具

37、Linux中Xsync数据同步备份工具 一、介绍二、配置集群hostname三、修改xsync文件四、赋权五、安装Rsync六、验证一七、配置免密登录1、生成rsa密钥2、copy机器自身公钥到目标机器3、.ssh/文件目录赋权 八、验证二 ⚠️ 注&#xff1a;本文全程在普通用户下操作&#xff0c;…

基于RK3588多can口多串口机器人全功能板

RK3588机器人控制器有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的 H.265 和 VP9 解码器、8K30fps 的 H.264 解码器和 4K60fps 的 AV1 解码器&#xff1b;支持 8K30fps 的 H.264 和H.265 编码器&#xff0c;高质量的 JPEG 编码器/解码器&…

网络探测工具Nmap介绍

1. Nmap简介 Nmap是一款用于网络发现和安全审计的网络安全工具。可用于列举网络主机清单、管理服务升级调度、监控主机、监控主机服务运行状况、检测目标主机是否在线和端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等。 2. 命令大纲 3. 命令详细介绍…

基于 Linux 的更新版 MaxPatrol VM 可扫描 Windows

&#x1f47e; MaxPatrol VM 2.1 是俄罗斯唯一一款可以安装在 Linux 上并以审计和五重测试模式扫描 Windows 主机&#xff08;甚至是旧版本&#xff09;的漏洞管理产品。 让我们告诉你更新后的 MaxPatrol VM 还有哪些有用的功能&#xff1a; 1. 由于采用了新的数据存储模式&a…

【物联网开源平台】tingsboard安装与编译

别看这篇了&#xff0c;这篇就当我的一个记录&#xff0c;我有空我再写过一篇&#xff0c;编译的时候出现了一个错误&#xff0c;然后我针对那一个错误执行了一个命令&#xff0c;出现了绿色的succes,我就以为整个tingsboard项目编译成功了&#xff0c;后面发现的时候&#xff…

dubbo 源码系列之-集群三板斧---负载均衡(二)

在上一课时我们了解了 LoadBalance 接口定义以及 AbstractLoadBalance 抽象类的内容&#xff0c;还详细介绍了 ConsistentHashLoadBalance 以及 RandomLoadBalance 这两个实现类的核心原理和大致实现。本课时我们将继续介绍 LoadBalance 的剩余三个实现。 LeastActiveLoadBala…

C语言从入门到实战----数据在内存中的存储

1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤…

[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两相乘再相加的和&#xff0c;即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a 1 ⋅ a n a 2 ⋅ a 3 ⋯ a n − 2 ⋅ a n − 1 a n − 2 ⋅ a…