【Linux】进程状态

进程状态

  • 进程状态的简要介绍
  • 运行状态
    • 进程排队
  • 阻塞状态
  • 挂起状态
  • Linux中的进程状态

进程状态的简要介绍

  进程状态指的是一个操作系统中正在运行的进程当前所处的状态。根据不同的操作系统,进程状态可能会有一些细微的差别,但最主要的是以下三种状态

  1. 运行状态
  2. 阻塞状态
  3. 挂起状态

  下面我会对这三个状态做一个详细的介绍

运行状态

  谈到运行状态我们常常会有一个误区,那就是认为一个进程在运行中才能叫做运行状态,其实不然,只要是进程在运行中或者是在运行队列中都可以被称作当前进程处于运行状态
  那么此时又有了一个新的概念:运行队列,什么是运行队列?简单来说,运行队列就是操作系统中用来存储和管理进程的数据结构,通过该队类可以充分利用 CPU 资源并提高系统的响应速度。也可以这么认为,这么运行队列和我们平常认识的队列特殊就在于运行队列中装的都是进程,并且这个运行队列是专门为CPU所服务的。
  我们想要运行进程,就需要CPU去参与运算,但是进程有很多,CPU却只很少,大部分的电脑上只有一个CPU,所以为了高效率管理,操作系统就会帮CPU维护一个运行队列,当我们想要加载一个进程时,首先操作系统就会让这个进程的pcb对象去CPU的运行队列中排队,这个时候,有牵扯出了一个新的概念:进程排队

进程排队

  通过进程的初步认识一和进程的初步认识二我们知道,所谓的pcb对象,实际上就是一个结构体对象,所以,进程排队,我们就可以简单理解为将一个结构体对象push到队列中。
  了解到了以上之后,我们再来看看这个pcb对象是如何push到队列中的
在这里插入图片描述

  可以看到,在pcb中嵌套了一个struct listnode类型的结构体对象,这个结构体对象的next指针指向的就是下一个结构体对象中的类型为struct listnode的结构体对象,并且一个pcb对象中包含了不止一个struct listnode的结构体对象,这样就确保了该pcb对象可以同时被联入不同的数据结构中。
补充
  虽然这样的结构设计可以确保pcb同时在操作系统中的不同的数据结构中,但是next指针和prev指针始终只能指向下一个pcb对象中的struct listnode类型的结构体对象,我们找到pcb对象的主要目的就是访问pcb对象的数据,通过这种方法却只能访问pcb对象中的某个成员变量,那要怎么去访问整个pcb对象呢?
  我们可以简化以下这个问题

struct A
{char x;int c;
};int main()
{struct A s;return 0;
}

  以该结构体为例,当我们知道了s的成员变量c的地址,要想知道结构体对象s的地址,通过结构体的内存对齐规则可以得出&c=&s+偏移量,现在拿到了c的地址,要知道s的地址,也就是&s=&c-偏移量,我们只需要知道偏移量即可
  要知道偏移量,我们可以对零地址(地址为0)进行强转成struct A类型,然后对拿到的成员变量n进行取地址操作,由于结构体对象的地址为0,所以变量n的地址就是n相对于结构体对象地址的偏移量
  同理,当我们知道了pcb对象中的struct listnode类型的结构体对象的地址,我们也可以进行如上操作,即&s=(task_struct*)(&c-&((task_struct*)0->c))

阻塞状态

  首先我们要知道,进程不是一直都在运行的,有时候进程需要等待某种硬件资源,比如在C语言程序中,我们会用到printf函数和scanf函数,printf函数就需要用到屏幕,而scanf就需要键盘,如果说进程没有等到对应的硬件资源时,它就不会继续运行。而是会做两件事

  1. 将当前进程状态由运行状态改为阻塞状态
  2. 将pcb对象连到对应资源的等待队列中

  通过以上我们可以知道,不是只有CPU才有队列,其他的设备也有自己的队列。
  当一个程序中有scanf函数需要用到键盘,CPU此时无法继续执行下去,操作系统就会将该程序对应进程pcb从CPU的运行队列拿到键盘的等待队列中去,当我们通过键盘按下一个按键的时候,操作系统会将该数据拿到并交给对应的进程,然后再将pcb从键盘的等待队列中拿到CPU的运行队列中去

挂起状态

  挂起状态的前提就是当前计算机的资源(主要是内存资源)已经十分吃紧了,而有个进程还在等待队列中(阻塞状态)
  也就是说当前进程无法继续执行下去并且该进程对应的可执行程序仍然会占用内存空间,操作系统为了节省资源,就会将该进程的对应的程序和数据写入磁盘中,这个时候该进程就是挂起状态。等到该进程要再次被调度的时候操作系统再将对应的数据和程序加载到内存
补充
  操作系统一般会将进程所对应的代码和数据放到磁盘中的一块固定的区域,这块区域叫做swap分区,这个区域是操作系统在资源紧张的时候和磁盘进行数据交换的地方
在这里插入图片描述
  一般来说,swap分区不会太大,通常是内存大小的一般或者是等于内存大小,最多不会超过内存大小的两倍,因为唤入和唤出其实是一个访问外设的过程(将数据进行拷贝),这是比较慢的,用效率换取系统的稳定性,如果将swap分区设置的比较大,那么操作系统就会比较依赖这个swap分区最终带来的结果就是整个系统和swap分区IO交互的频率变高,使得系统的效率就变低了

Linux中的进程状态

  那么,进程状态究竟是什么呢?实际上进程状态实际上就是整形变量,就像下面这样

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

  以上为状态在kernel原代码中的定义。

R 运行状态:
  运行状态并不代表着进程正在运行中,它表明进程要么是在运行中要么在运行队列里随时做好了被调度的准备
在这里插入图片描述
补充:前台进程和后台进程
Linux中,前台进程和后台进程是指进程与终端(Terminal)之间的关系。

前台进程:前台进程是指当前正在终端上活跃运行的进程,它会接收终端输入并向终端输出信息。用户可以直接与前台进程进行交互,而且前台进程通常会占用终端的显示区域。当一个进程在前台运行时,用户可以通过键盘输入命令来控制该进程的行为。

后台进程:后台进程是指在终端上运行,但不会占用终端显示区域或接收终端输入的进程。用户可以将一个前台进程转为后台进程,从而让其在后台静默运行,不影响用户在终端上的其他操作。后台进程通常用于执行一些需要长时间运行的任务,或者不需要用户直接交互的程序。

  T在Linux中,可以使用特定的命令和符号来控制进程的前台和后台运行。例如,使用 & 符号可以将一个命令放到后台运行;使用 fg 命令可以将一个后台进程切换到前台运行。这些功能使得用户能够更灵活地管理和控制系统中的进程。

S 睡眠状态:
  睡眠状态意味着在等待某个事件的完成(这个睡眠也叫做可中断睡眠),当我们在C语言文件中加入sleep函数也可以使进程变为睡眠状态
在这里插入图片描述

在这里插入图片描述
  在以上代码中,因为进程一直在等待从键盘中拿数据,所以该进程处于键盘的等待队列中,此时的状态就是直接讲到的阻塞状态,在Linux中,将其之为睡眠状态

D 磁盘休眠状态
  有时候也叫不可中断睡眠状态,在这个状态下的进程通常会等待IO的结束(操作系统在内存严重不足时会杀死进程,但是不会中断状态为D的进程)

T 停止状态
  T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
在这里插入图片描述
注意:一旦将一个进程停止,这个进程就变成了后台进程

X死亡状态
这个状态只是一个返回状态,你不会在任务列表里看到这个状态

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

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

相关文章

电路设计(26)——速度表的multisim仿真

1.设计要求 设计一款电路,能够实时显示当前速度。 用输入信号模拟行驶的汽车,信号频率的1hz代表汽车速度的1m/s。最后速度显示,以km/h为单位。 2.电路设计 当输入信号频率为40HZ时,显示的速度应该为144KM/h,仿真结果为…

IP地址证书详解

IP地址证书是一种特殊的SSL/TLS证书,它直接绑定到服务器的公网IP地址而不是域名,这种类型的证书特别适合于那些没有域名只有公网IP或者不方便使用域名的企业或个人。证书允许通过特定的IP地址访问的Web服务提供HTTPS加密连接,确保在没有使用域…

深入理解flinksql执行流程,calcite与catalog相关概念,扩展解析器实现语法的扩展

深入理解Flink Sql执行流程 1 Flink SQL 解析引擎1.1SQL解析器1.2Calcite处理流程1.2.1 SQL 解析阶段(SQL–>SqlNode)1.2.2 SqlNode 验证(SqlNode–>SqlNode)1.2.3 语义分析(SqlNode–>RelNode/RexNode&#…

EfficientNet环境搭建网络修改

引子 在深度学习CV领域,最初2012年突破的就是图像分类,发展这么多年,基本上已经没有什么进展了。此篇作为之前EfficientNet挽留过的总结,现在整理下,OK,让我们开始吧。 一、EfficientNet安装 1、pytorch…

Window部署Exceptionless

Exceptionless Elasticsearch 版本: Exceptionless:8.1.0 Elasticsearch:7.17.5 JDK:11.0.10 目录 一、Elasticsearch运行 二、 Exceptionless 一、Elasticsearch运行 bin目录下elasticsearch.bat 直接运行 访问 http://lo…

线性代数:向量空间

目录 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系? 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

React18原理: React核心对象之Update、UpdateQueue、Hook、Task对象

Update 与 UpdateQueue 对象 1 ) 概述 在fiber对象中有一个属性 fiber.updateQueue是一个链式队列(即使用链表实现的队列存储结构)是和页面更新有关的 2 )Update对象相关的数据结构 // https://github.com/facebook/react/blob/v18.2.0/pa…

台式电脑电源功率越大越费电吗?装机选购多少W电源

要组装一台电脑,我们首先需要选择硬件。 硬件搭配最关键的一点就是CPU和主板的兼容性。 硬件、电源等之间的平衡都需要仔细考虑。 那么台式电脑电源多大功率合适呢? 下面分享组装电脑电源瓦数选购指南,教您正确选择合适的电源瓦数。 让我们来…

PULpy安装与使用

今天试一下安装PULpy GitHub - WatsonLab/PULpy: Open prediction of Polysaccharide Utilisation Loci (PUL) 下载下面这个文件 https://github.com/WatsonLab/PULpy/blob/master/envs/PULpy.yaml mkdir PULpy cd PULpy #将刚刚下的文件放到PULpy文件夹中 conda env crea…

win系统下安装php8.3版本并配置环境变量的详细教程

本篇文章主要讲解在win系统下安装和配置php8.3版本,并配置环境变量的详细教程。 日期:2024年2月22日 作者:任聪聪 一、下载php8.3版本包 php8.3版本官方下载地址:https://windows.php.net/download#php-8.3 步骤一、打开下载地址…

2023年的AI模型学习/部署/优化

可以的话,github上给点一个小心心,感谢观看。 LDC边缘检测的轻量级密集卷积神经网络: meiqisheng/LDC (github.com)https://github.com/meiqisheng/LDC segment-anything分割一切的图像分割算法模型: meiqisheng/segment-anyt…

Linux环境安装Git(详细图文)

说明 此文档Linux环境为:Ubuntu 22.04,本文档介绍两种安装方式,一种是服务器能联网的情况通过yum或apt命令下载,第二种采用源码方式安装。 一、yum/apt方式安装 1.yum方式安装Git 如果你的服务器环境是centos/redhot&#xff…

说一说Eclipse的项目类型和常用项目的区别

Eclipse在新建项目的时候有很多类型,包括Java project、Web project等等,如下: 那么这些项目类型有什么区别呢?我们在创建项目的时候应该如何选择,了解清楚这一点还是非常重要的,但记住一个出发点&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月23日,星期五

每天一分钟,知晓天下事! 2024年2月23日 星期五 农历正月十四 1、 多家银行密集下调存款利率,下调幅度从10个基点至60个基点不等。 2、 两部门联合下发通知:推动根治欠薪、违法安排超时加班。 3、 中国铁路:铁路12306…

kafka和ZK的关系

zk相当于是kafka的一个基础设施 Kafka是一种高吞吐量、可扩展的分布式发布订阅消息系统,ZooKeeper是一个分布式协调服务,用于管理和协调分布式系统中的各种资源 Zookeeper:管理broker,consumer 创建broker后,向zk注册…

数据仓库【指标体系】

指标体系是将零散单点的具有相互联系的指标,系统化的组织起来,通过单点看全局,通过全局解决单点的问题。它主要是由指标和体系两部分组成。 指标是指将业务单元细化后量化的度量值,它使得业务目标可描述、可度量、可拆解&#xff…

聊一聊EGO-Planner膨胀系数的大小对无人机避障飞行的影响

EGO-Planner简介 EGO-Planner作为业界知名的无人机轨迹规划算法,其优势在于能够在复杂环境中快速规划出安全、平滑且动态可行的飞行轨迹。在这个算法中,膨胀系数发挥着关键作用。它通过扩大障碍物的感知范围,提供额外的安全边距,…

1、WEB攻防-通用漏洞SQL注入MYSQL跨库ACCESS偏移

用途:个人学习笔记,欢迎指正! 前言: 为了网站和数据库的安全性,MYSQL 内置有 ROOT 最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他…

关于使用Mxnet GPU版本运行DeepAR报错解决方案

1.引言 我们经常使用GPU来训练和部署神经网络,因为与CPU相比,它提供了更多的计算能力。在本教程中,我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先,确保您的机器中至少有一个Nvidia GPU,并正确安装了CUDA以及CUDN…