进程状态的理解

我们知道进程会有属于自己的PCB,便于操作系统的管理,而PCB结构体里面还有进程状态参数,类似于用一个变量标识对应的进程状态,就相当于将每个进程状态编号,而PCB中有一个变量存储当前进程状态所对应的编号,也就表明当前进程对应的具体状态,好让操作系统看到具体的状态,并对其更好地进行操作。所以总而言之进程状态的本质其实就是PCB内部的一个整形变量,不同的整型值对应着不同的进程状态

而对于普适的操作系统而言进程状态图是这样的:

 操作系统层面的进程状态

运行状态

我们知道每个进程都有自己所对应的PCB,当进程运行的时候,为了更好地进行进程管理调度,会为每一个CPU创建一个运行队列,也就是一个结构体类型,内部会将每一个需要运行的进程所对应的PCB列入到运行队列当中去,此时该进程PCB中标志进程变量的值就可以设为运行状态对应的数值。所以运行状态就是处于CPU运行队列当中的进程。但是也要注意,处于运行状态的进程并不是证明该进程就一定在被CPU运行。

阻塞状态

当一个进程被运行时,该进程可能会访问对应的外设,例如硬盘、键盘...例如我们的C++代码当中调用cin函数时,肯定需要访问键盘,进程想要运行需要从键盘中拿数据,但是如果此时不在键盘上输入任何数据的话,此时就可以说该程序状态是阻塞状态。

同样像管理进程一样,操作系统为了管理好硬件资源,也会为硬件设备创建对应的结构体,而每个结构体都标识着对应的硬件,而每一个硬件数据信息都会存在该结构体当中,便于像操作系统管理进程一样管理硬件设备。而每一个硬件设备对应的结构体当中还有一个PCB*的类型wait_queue的变量,是一个等待队列。会将所有访问硬件不成功的进程链入到对应的等待队列当中。所以上面的例子当中,该进程需要的访问键盘硬件不成功,会将该进程的PCB链入到键盘的等待队列当中,并将该进程PCB中标志进程变量的值改成阻塞状态对应的数值。直到硬件被成功访问之后再将进程pcb列回到运行队列中。

阻塞状态不仅仅只有等待硬件资源这一种,实际上一个进程执行时需要访问另一个进程时,而另一个进程未响应的话,这一个进程也会处于阻塞状态。或者一个进程访问软件资源,等待软件资源就绪时也会处于阻塞状态。

挂起状态

当我们的一个进程发生阻塞时,进程就会等待某种资源,而此时进程的代码和数据依旧是存在内存当中的,占据着内存空间。但是如果此时恰巧内存空间不足的话,为了避免操作系统崩溃的可能,操作系统就会将所有阻塞状态的进程所对应的代码和数据从内存中拿出来交换到磁盘当中,此时就释放了一部分资源供给操作系统使用。此时该进程就属于挂起状态。

其实我们的磁盘当中有一个swap分区,大小一般等于内存大小。而这部分空间就是专门给操作系统进行内存与外存数据交换的。也就是将上面提到的阻塞状态进程的代码和数据进行交换到这磁盘的swap分区的,当该进程再次能被操作系统调度的时候,那么被置换出去的代码和数据又将会置入到操作系统的内存当中。


Linux下的进程状态

其实Linux操作系统下面的状态本质上是和上面差不多的,只不过会换种说法:

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

R状态 

R状态其实就是操作系统上的运行状态,但是在一般查看进程状态时是很难看到R状态的。

此时进程的代码仅仅是执行死循环,啥也没干,也就是说该进程始终在CPU的运行队列中。

S状态

S全称sleep,也就是休眠状态,相当于操作系统上的阻塞状态。

此时该进程执行时处在S状态,其实就是表明该进程此时在等待队列中,因为该进程需要执行printf函数,需要访问显示器这个硬件设备,但是显示器并不一定资源就绪,所以查看该进程时就处于休眠状态。其实本质上是因为硬件的执行效率远远低于CPU的执行效率,而访问硬件速度相较而言是十分缓慢的,CPU的运行是十分快的。所以查看进程状态时,几乎绝大部分时间都是在等待硬件资源就绪,只有极少的时间是在运行代码。

注:查看进程状态时,后面几乎都有个+:其实这种进程叫做前台进程也就是进程运行时命令行是无法执行其他命令,也就是不能运行其他进程

没有+:该进程称为后台进程,也就是说是在后台运行的,所以说命令行当中还可以执行其他命令,运行其他的进程(执行后台进程需要在命令行中输入该进程运行指令时,后面加上&符)后台进程无法通过Ctrl c终止进程,想要终止只能强行杀掉该进程:kill -9 +进程pid

D状态

D状态其实也是休眠状态,但是属于深度休眠,相较于S状态会对外部信号做出响应而言,而D状态不会对外部信号做出响应。而disk其实就是磁盘的意思,也就是磁盘休眠。

操作系统的挂起状态我们已经了解过,就是当内存空间不足时,操作系统会将阻塞状态进程的代码和数据进行提出交换到磁盘上去。但如果恰巧在此时,操作系统的空间还是不足的话,那么该进程的PCB就极可能会被操作系统给kill掉。

假如说,当一个进程需要向硬盘中写入数据,在磁盘写入数据的过程中该进程始终处于阻塞状态,也就S状态,而此时操作系统中内存爆满的话,该进程就会被删掉,那么此时磁盘读取数据也恰巧失败的话,将信息反馈给进程,可进程也被删除了,无响应,那么磁盘为了不影响其他进程的访问,就也会将进程的数据清除,而此时数据就全部丢失。所以就有了D状态,处于此状态的进程不会被操作系统删掉也不能被用户删掉,只能等待进程自行恢复或者强行关电源。

T状态

T状态就是暂停的意思。可以通过 kill-l 查看进程信息的详细列表

其实编号后面就代表着该编号所执行的操作。 SIG就是signal(信号)的缩写,使用该指令时后面要跟上进程pid,所以可以kill -19 +pid或者kill -SIGSTOP +pid暂停进程,而且暂停以后该进程就自动变成后台进程了。想要恢复该进程的话可以使用18号指令CON(continue)

t状态

tracing stop追踪暂停状态,进程处于此状态表示该进程正在被追踪。

当我们的代码在debug(-g)下时,可以使用gdb+可执行程序调试代码,此时使用b打断点,然后再r(在第一个断点处停止),此时该进程的状态就是t状态

X状态

x状态就是死亡状态,表示该进程运行结束了,所以说该进程的PCB和代码数据都被操作系统回收了。

Z状态

Z状态就是僵尸状态。当一个进程执行完该进程需要执行的操作之后,该进程会返回任务执行的结果,并反馈给操作系统或者其父进程。

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

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

相关文章

解决WordPress升级后提示:无需升级,您的WordPress数据库已经是最新的了

问题描述 当升级了 WordPress 6.3 后,登录后台出现了提示:无需升级,您的WordPress 数据库已经是最新的了。并且无法进入后台了。 出现这个问题的原因可能是你网站开启了 Memcached 缓存。 如何验证是否开启了 Memcached 缓存?检…

php 安装mongodb扩展模块,rdkafka模块

mongodb mongodb扩展下载 选择php版本,根据报错提示,选择扩展对应的版本选择非安全进程将php_mongodb.dll放到php/ext目录下修改php.ini配置,添加extensionphp_mongodb.dll开启php_mongodb扩展,重启服务php -m 查看是否开启成功…

排序(order by)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select */列名 from 表名 order by 列名1 asc/desc, 列名2 asc/desc; 说明: 排序的目的:改变查询结果的返回顺序…

大数据软件项目的数据清洗

大数据软件项目中的数据清洗是数据预处理过程中的重要环节,用于识别和纠正数据集中的错误、不一致性和不完整性。虽然没有专门的"数据清洗开发框架",但有许多工具和库可用于数据清洗任务。以下是一些常见的数据清洗工具和库,可以与…

win10 U盘安装教程

一年内,第三次重装电脑了,我必须要写一份教程了。从制作U盘开始,到重装系统,全部都记录一下,以备不时之需。 首先,找一个U盘,如果U盘内有需要文件,请自行备份,因为这个U盘…

JVM(Java虚拟机)

目录 1.JVM 简介 1.1 JVM 发展史 1.Sun Classic VM 2.Exact VM 3.HotSpot VM 4.JRockit 5.J9 JVM 6.Taobao JVM(国产研发) 1.2 JVM 和《Java虚拟机规范》 2. JVM 运行流程 JVM 执行流程 3. JVM 运行时数据区 3.1 堆(线程共享&…

泛型的小结

文章目录 什么是泛型泛型的相关概念泛型的作用 泛型的使用泛型类语法泛型接口语法泛型方法语法泛型类的简单示例泛型接口的简单示例基于泛型的简单工厂方法泛型的上界与下界 泛型的一些使用建议 什么是泛型 从JDK1.5开始引入泛型(generic)语法。对类型实…

一文看懂光模块的工作原理

你们好,我的网工朋友 光模块有很多类别,是我们经常要用到的PHY层器件。虽然封装,速率,传输距离有所不同,但是其内部组成基本是一致的。 以太网交换机常用的光模块有SFP,GBIC,XFP,X…

【Linux】 rm命令使用

作为一个程序员 我们经常用到rm -rf * 或者rm -rf XXX 。但是rm -rf 是什么意思不是很清楚,咱们一起来学习一下吧。 rm(英文全拼:remove)命令用于删除一个文件或者目录。 rm 命令 -Linux手册页 著者 由保罗鲁宾、大卫麦肯齐、理…

10.8队列安排,最少找字典次数,表达式转换与计算模拟(栈、队列)

队列安排1160 灵活的插入与删除 用队列实现的话,就是双端队列, 第一阶段是要找到对应编号的同学,然后根据p的取值决定是怎么插入 第二阶段也是要找到对应编号同学,之后就删除,如果找不到就返回 思路是这个思路&…

为什么团队需要实时协作?该如何实现?

协作是任何组织成功的关键部分,通过明确定义的愿景和使命并基于透明度和持续沟通来执行。 实时的协作是指员工之间就不同的项目、任务、文件或文档进行同步、无缝的互动和协作,他们几乎不受任何地理边界的限制,即时沟通和分享反馈、想法和信…

【AI视野·今日Robot 机器人论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 4 Oct 2023 Totally 40 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚基于神经网络的多模态触觉感知, classification, position, posture, and force of the grasped object多模态形象的解耦(f…

从零开始的C++(七)

1.malloc、free和new、delete的区别: 1、.malloc、free是函数,new、delete是运算符。 2、malloc不会调用构造函数,new可以调用构造函数。 3、malloc开辟失败返回NULL,new失败会捕捉异常。 4、malloc不会自动计算类型大小&…

好奇喵 | PT(Private Tracker)——什么是P2P,什么是BT,啥子是PT?

前言 有时候会听到别人谈论pt,好奇猫病又犯了,啥子是pt? PT——你有pt吗?啥是pt? 从BT开始 BitTorrent是一种点对点(P2P)文件共享协议,用于高速下载和上传大型文件。它允许用户通…

钡铼BL124PN:简单快速转换Profinet到Ethernet/IP

钡铼技术BL124PN是一款高性能的Profinet转Ethernet/IP网关设备。该网关专为工业自动化领域设计,用于实现不同协议之间的互连和通信。BL124PN采用可靠稳定的硬件和先进的通信技术,具有以下主要特点: 协议转换能力:BL124PN能够将Pr…

暴力破解及验证码安全

1.暴力破解注意事项 1、破解前一定要有一个有郊的字典(Top100 TOP2000 csdn QQ 163等密码) https://www.bugku.com/mima/ 密码生成器 2、判断用户是否设置了复杂的密码 在注册页面注册一个,用简单密码看是否可以注册成功 3、网站是…

RabbitMQ-网页使用消息队列

1.使用消息队列 几种模式 从最简单的开始 添加完新的虚拟机可以看到,当前admin用户的主机访问权限中新增的刚添加的环境 1.1查看交换机 交换机列表中自动新增了刚创建好的虚拟主机相关的预设交换机。一共7个。前面两个 direct类型的交换机,一个是…

TDengine+OpenVINO+AIxBoard,助力时序数据分类

时间序列数据分析在工业,能源,医疗,交通,金融,零售等多个领域都有广泛应用。其中时间序列数据分类是分析时序数据的常见任务之一。本文将通过一个具体的案例,介绍 Intel 团队如何使用 TDengine 作为基础软件…

019 基于Spring Boot的教务管理系统、学生管理系统、课表查询系统

基于Spring Boot的教务管理系统、学生管理系统、课表查询系统 一、系统介绍 本作品主要实现了一个课表查询系统,采用了SSM(Spring SpringMVC MyBatis)的基础架构。 二、使用技术 spring-bootspring-MVCthymeleafmybatis-plusdruidLombo…

windows 远程连接 ubuntu桌面xrdp

更新 sudo apt update安装组件 sudo apt-get install xorg sudo apt-get install xserver-xorg-core sudo apt-get install xorgxrdp sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsxrdp sudo apt install xrdp sudo systemctl status xrdp sudo …