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

news2024/12/25 3:05:21

        

目录

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.coloradmin.cn/o/1549297.html

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

相关文章

AI+云平台|全闪云底座迎战

AI融万物之势席卷而来 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 行业特点 AI场景中80%以上是小文件&#xff0c;以非结构化数据为…

maya导入导出bvh 自动 脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件,点击右下角 “脚本编辑器” 运行打开bvh脚本<

一款比 K8S 更好用的编排工具——Nomod 单机部署

上下文 最近公司需要调研类似 EMCHub 这样支持算力共享的服务。第一直觉是使用 K8S 或 K3S&#xff0c;作为 CNCF 孵化的顶级项目&#xff0c;同时也是当前云原生生态使用最广的编排系统。但是在学习 EMC Hub 源码过程中&#xff0c;偶然发现它是基于 Nomad 做的集群管理。 相…

如何清理释放群晖客户端缓存?

任正菲说&#xff1a;企业最大的浪费&#xff0c;是经验的浪费&#xff01; 而一个一个的经验&#xff0c;又都来自企业的每一个工作者。 因此当我们在工作过程中遇到一些问题时&#xff0c;我们就应该下意识的把解决问题的经验沉淀下来&#xff0c;从而可以与大家进行分享。…

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

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

django orm DateTimeField 6位小数精度问题

from django.db.backends.mysql.base import DatabaseWrapperDatabaseWrapper.data_types[DateTimeField] "datetime"意思就是重写源码里面的DateTimeField字段

如何在家中使用手机平板电脑 公司iStoreOS软路由实现远程桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

C++ 控制语句(一)

一 顺序结构 程序的基本结构有三种&#xff1a; 顺序结构、分支结构、循环结构 大量的实际问题需要通过各种控制流程来解决。 1.1 顺序结构 1.2 简单语句和复合语句 二 循环 2.1 for循环 语句流程图 注意&#xff1a;使用for语句的灵活性 三 while语句 四 do while语句

线程 和 进程详解——以Java为例

一、概念 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 简单理解&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能 进程 进程是程序的基本执行实体。 多线程中的两个概念&#xff1a;并发和并行…

鸿蒙OS开发实例:【工具类封装-emitter组件间通信】

import Emitter from ohos.events.emitter; import pasteboard from ohos.pasteboard; MyEmitterUtil 是一个针对 HarmonyOS 的事件驱动编程封装类&#xff0c;主要用于组件间的通信和数据传递。 使用要求&#xff1a; DevEco Studio 3.1.1 Release 或更高版本API 版本&…

vue3+threejs新手从零开发卡牌游戏(十六):初始化对方手牌

添加对方手牌区时注意位置调整&#xff0c;以及手牌应该是背面朝上&#xff0c;加个rotateX翻转即可&#xff0c;其他代码和p1.vue代码一致&#xff0c;game/hand/p2.vue代码如下&#xff1a; <template><div></div> </template><script setup lan…

C++:关键字(4)

在c中的关键字就是我们各个写的各种代码 这些就是关键字&#xff0c;这些东西是无法当参数的&#xff0c;比如在给变量名设置为int那就不行 这就是个错的 在写其他的参数时候&#xff0c;不可以使用关键词作为参数

Vue 与 React:前端框架对比分析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C语言程序编译与链接(拓宽视野的不二之选)

文章目录 翻译环境和运行环境翻译环境预处理编译汇编链接 运行环境 翻译环境和运行环境 1&#xff0c;在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指 令&#xff08;⼆进制指令&#…

AI Agent(LLM Agent)入门解读

1. 什么是AI Agent&#xff1f; AI Agent可以理解为一个智能体&#xff0c;包括感知模块、规划决策模块和行动模块&#xff0c;类似于人类的五官、大脑和肢体。它能帮助人类处理复杂的任务&#xff0c;并能根据环境反馈进行学习和调整。 五官可以理解为感知模块&#xff0c;大…

2024年上半年数学建模竞赛一览表(附赠12场竞赛的优秀论文+格式要求)[电工、妈杯、数维、五一等12场]

为了帮助大家更好地备战今年上半年十二场数学建模竞赛&#xff0c;我们为大家收集到了这十二场相关竞赛的优秀论文以及格式要求&#xff0c;具体内容如下所示。 资料获取 在文末 文中资料来源 名称竞赛官方网站天府杯https://www.tfmssy.org.cn/认证杯http://www.tzmcm.cn/i…

中国土壤厚度空间分布数据

土壤层次分为覆盖层 林溶层 淀积层 母质层&#xff0c;其中在林溶层中的最上面那层就是我们通常说的土壤厚度在这一层中&#xff0c;这一层也被称为腐殖层&#xff0c;是肥力性质最好的一层&#xff0c;植物根系和微生物也集中在这一层。至于覆盖层在森林土壤中比较常见&#x…

零基础学python之高级编程(6)---Python中进程的Queue 和进程锁,以及进程池的创建 (包含详细注释代码)

Python中进程的Queue 和进程锁,以及进程池的创建 文章目录 Python中进程的Queue 和进程锁,以及进程池的创建前言一、进程间同步通信(Queue)二、进程锁&#xff08;Lock&#xff09;三、创建进程池Poorpool 类方法: End! 前言 大家好,上一篇文章,我们初步接触了进程的概念及其应…

matlab实现神经网络

一、原理 人工神经网络是具有适应性的简单神经元组成的广泛并互连的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体作出的交互式反应。人工神经网络具有自学习、自组织、较好的容错性和优良的非线性逼近能力 将神经网络的学习能力引入到模糊系统中&#xff0c;…

Zabbix 配置使用

目录 配置流程 添加组机组 添加模板 添加主机 配置图形 配置大屏 Monitoring 配置地图 最新数据 故障 使用IT服务 使用报表 资产管理 全局搜索 导入导出 用户权限 用户组权限 用户 匿名用户 调试模式 与 LDAP 对接 维护模式 故障确认 批量更新 配置流程…