【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() 等系统调用来处理僵尸进程,获取子进程的退出状态并释放相关的资源。这样做可以确保系统中不会出现大量僵尸进程,保持系统资源的有效利用。

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

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

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

相关文章

什么是物联网监控平台?部署物联网平台有什么作用?

随着物联网技术的飞速发展&#xff0c;越来越多的企业开始关注并投入到这一领域。物联网监控平台作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为企业数字化转型的关键组件。今天&#xff0c;我们将深入探讨物联网监控平台的定义、部署物联网平台的作用&#xff0c;以…

OSPF-区域间路由计算

一、概述 前面学习了我们学习了Router-LSA和Network-LSA&#xff0c;它们都只能在区域内进行泛洪&#xff0c;而且我们之前一直主要是单区域学习。OSPF的核心是骨干区域Area 0&#xff0c;其它都为非骨干区域。但是在大型网络中&#xff0c;单区域OSPF会存在一定的问题&#xf…

数据处理库Pandas数据结构DataFrame

Dataframe是一种二维数据结构&#xff0c;数据以表格形式&#xff08;与Excel类似&#xff09;存储&#xff0c;有对应的行和列&#xff0c;如图3-3所示。它的每列可以是不同的值类型&#xff08;不像 ndarray 只能有一个 dtype&#xff09;。基本上可以把 DataFrame 看成是共享…

libVLC 视频抓图

Windows操作系统提供了多种便捷的截图方式&#xff0c;常见的有以下几种&#xff1a; 全屏截图&#xff1a;通过按下PrtSc键&#xff08;Print Screen&#xff09;&#xff0c;可以截取整个屏幕的内容。截取的图像会保存在剪贴板中&#xff0c;可以通过CtrlV粘贴到图片编辑工具…

【数据结构和算法初阶(c语言)】二叉树系列oj题目图文详解

目录 1.单值二叉树 2.判断两颗二叉树是否相同 3.二叉树的前序遍历 接口了解 4.判断一棵树是不是另外一棵树的子树 5.判断一棵树是不是对称二叉树 6.二叉树遍历 1.单值二叉树 . - 力扣&#xff08;LeetCode&#xff09; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二…

Pillow教程07:调整图片的亮度+对比度+色彩+锐度

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

uniapp流浪动物救助小程序Java宠物领养小程序springboot

uniapp流浪动物救助小程序Java宠物领养小程序springboot 代码40块&#xff0c;需要的私聊 前台基于uniapp小程序 后台管理基于springbootvue前后端分离项目 开发语言&#xff1a;Java 框架&#xff1a;springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xf…

Sentinel源码解析

核心源码都在客户端,服务端只是个Dashboard!!! 在服务端配置好规则后,服务端会把规则推到客户端里去【存在客户端内存里】 服务端记录客户端对外提供的一些接口 客户端引用了依赖并启动后,会定时把自己的信息注册到Sentinel服务端去,并且定时发信息保持心跳 主线 注解…

vue2项目设置浏览器标题title及图标logo

工作中肯定会遇到要修改网页的标题title及图标logo 一、固定设置标题方案 方法一&#xff1a;在vue.config.js文件&#xff0c;添加如下代码&#xff1a; chainWebpack: config > {// 配置网页标题config.plugin(html).tap((args) > {args[0].title 标题return args})…

CV领域 交叉注意力(Cross Attention)中QKV的含义理解

交叉注意力公式&#xff1a; 注意力的输入&#xff1a; &#xff08;1&#xff09;KV&#xff1a;图像的全局特征 &#xff08;2&#xff09;Q&#xff1a;告诉attention需要关注哪些重要特征 公式计算过程理解&#xff1a; &#xff08;1&#xff09;&#xff1a;Q和K相乘…

【C++入门】 初见,单推,与C++的第一次约会

关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒ 引言&#xff1a;本篇博客我们开始与C的第一次约会&#xff0c;C是兼容c的&#xff0c;本篇博客我们将了解到C关键字有哪些&#xff0c;C命名空间&#xff0c;C输入与输出和缺省参数的内容&#xff0c;请放心食用 ~ 文章目录 一 &#x1f3e0; C…

k8s入门到实战(七)—— 回顾:使用yaml文件配置pv、pvc、configmap部署mysql服务

实战&#xff1a;部署 mysql 服务 回顾加深 pv、pvc、configmap 删除所有 deployment、pv、pvc、configmap、StorageClass创建一个 nsf 挂载目录给 mysql mkdir -p /nfs/data/mysql创建 yaml 文件mysql-server.yaml # 创建pv apiVersion: v1 kind: PersistentVolume metadat…

【深度学习】最强算法模型之:潜在狄利克雷分配(LDA)

潜在狄利克雷分配 1、引言2、潜在狄利克雷分配2.1 定义2.2 原理2.3 算法公式2.4 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 给我讲一讲LDA 小鱼&#xff1a;LDA&#xff1f; 你指的是&#xff1f; 小屌丝&#xff1a;就是算法模型的LDA啊&#xff0c; 你…

剑指Offer题目笔记19(二分查找)

面试题68&#xff1a; 问题&#xff1a; ​ 输入一个排序的整形数组nums和一个目标值t&#xff0c;如果数组nums中包含t&#xff0c;则返回在数组中的下标&#xff0c;否则返回按照顺序插入到数组的下标。 解决方案&#xff1a; ​ 使用二分查找。每次二分查找都选取位于数组…

【学习】软件科技成果鉴定测试有何作用

软件科技成果鉴定测试是针对软件进行项目申报、科技成果鉴定等相关目的进行的测试。软件测试报告可作为项目申报、科技成果鉴定等工作的依据之一。软件类科技成果鉴定测试从软件文档、功能性、使用技术等方面对软件系统进行符合性测试。其测试结果证明软件的质量是否符合技术合…

[DS]Polar靶场web(一)

静以养心&#xff0c;宽以养气。 跟着Dream ZHO大神学专升安的一天 swp 直接dirb扫出.index.php.swp的目录 function jiuzhe($xdmtql){return preg_match(/sys.*nb/is,$xdmtql);//如果包含以 "sys" 开始&#xff0c;后跟任意字符直到 "nb" 的字符串&…

基于Rflysim平台的无人机拦截三维比例导引算法仿真

【后厂村路钢铁侠出品】 一、Rflysim简介 RflySim是一套专为科研和教育打造的Pixhawk /PX4 和MATLAB/Simulink生态系统或工具链&#xff0c;采用基于模型设计&#xff08;Model-Based Design&#xff0c; MBD&#xff09;的思想&#xff0c;可用于无人系统的控制和安全测试。…

勾八头歌之分类回归聚类

一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…

超级会员卡积分收银系统源码:积分+收银+商城三合一小程序 带完整的安装代码包以及搭建教程

信息技术的迅猛发展&#xff0c;移动支付和线上购物已经成为现代人生活的常态。在这样的背景下&#xff0c;商家对于能够整合收银、积分管理和在线商城的综合性系统的需求日益强烈。下面&#xff0c;罗峰给大家分享一款超级会员卡积分收银系统源码&#xff0c;它集积分、收银、…

什么是RISC-V?开源 ISA 如何重塑未来的处理器设计

RISC-V代表了处理器架构的范式转变&#xff0c;特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变&#xff0c;提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点&#xff…