【Linux】进程周边002之进程状态

 

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.什么是状态? 

1.1运行

 1.2阻塞

1.3阻塞挂起

2.Linux下具体的进程状态

2.1运行状态-R

2.2可中断睡眠状态-浅度睡眠状态-S

2.3不可中断睡眠状态-深度睡眠状态-D

2.4停止状态-T

2.5死亡状态-X

2.6僵尸状态-Z

2.6.1僵尸进程的危害

2.7孤儿进程


前言

本篇文章博主将会讲解进程状态,之前我们讲到进程是有生命的,所以他在整个生命期间必然会有状态的变化。那么具体而言什么是状态呢?Linux中包含有那些状态呢?


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.什么是状态? 

所谓的状态其实就是task_struct中的一个整型变量。


状态决定了什么?你的后续动作!而Linux中可能会存在多个进程都要根据它的状态执行后续动作,此时就需要排队了。

1.1运行

一个CPU,一个运行队列,也就是说这些进程都需要在CPU这里进行排队,逐个执行。

而排队的是进程么?

其实不是,排队的是进程的PCB(面试时不是你在排队,而是你的简历信息在排队)。

在PCB中存在着多个节点成员,这些节点成员的存在就是为了“先描述再组织”中的组织而存在的。这也就实现了一个task_struct可以被链入多种数据结构中从而进程可以在不改变原有队列的同时,实现在各种各样的软硬件资源提供的队列中排队的操作。


但是就算进程放在了CPU上,也不是一直会运行的。在操作系统管理进程有时间片的概念,一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在Linux上为5ms-800ms),用户不会感觉到。

就好比我们的电脑,某个进程卡死了,而其他进程照常运行的原因就是这。 


 1.2阻塞

当进程在等待软硬件资源的时候(比如等待键盘输入),资源如果没有就绪。

此时task_struct就会被设置为阻塞状态,并链入等待的资源提供的等待队列

没错,这里的等待队列类似于CPU运行队列。

比如:


状态的变迁,引起的是PCB会被操作系统变迁到不同的队列当中。


1.3阻塞挂起

挂起状态的前提是计算机资源已经比较吃紧了。

阻塞挂起:因为等待某种软硬件资源就绪,进程对应PCB由运行队列转至资源下的等待队列时,考虑到内存空间紧张,操作系统会将因为等待而暂时无法运行的进程对应的代码和数据先由内存转移到磁盘中,此时进程即为挂起状态,等到该进程可以被运行时再将对应的代码和数据由磁盘转移回内存中。

当计算机资源比较吃紧时,操作系统一定要确保自身不会因为资源的紧张而崩溃,所以就会将一些等待资源(阻塞)的进程的代码和数据交换到磁盘的swap分区中,这个过程称为唤出。

当需要调度此进程时,就会将磁盘的swap分区中保存的内容换回到内存中,这个过程称为唤入。

注意:交换的是进程的代码和数据,不是PCB!!如果PCB被交换出内存了,那操作系统如何管理呢?

所以当某个进程的代码和数据不在内存中,而被换出到磁盘上时,该进程就为挂起状态。

以上的挂起都为阻塞挂起状态。


思考:swap分区是越大越好么?

磁盘本质是输入输出设备,每次唤入唤出其实都是非常低效的操作,如果swap分区设置的过大,那么操作系统就会十分依赖它,导致出现更多低效IO,这本身就是一种牺牲效率来确保操作系统能够正常运行的行为。

所以swap分区不宜设置的过大,一般为内存大小或内存大小的一半,具体要看不同的操作系统。


2.Linux下具体的进程状态

首先我们来看一下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 *task_state_array[] = {"R (running)",       /*  0*/"S (sleeping)",      /*  1*/"D (disk sleep)",    /*  2*/"T (stopped)",       /*  4*/"t (tracing stop)",  /*  8*/"Z (zombie)",        /* 16*/"X (dead)"           /* 32*/
};

接下来我们逐个介绍以上状态。 

2.1运行状态-R

运行状态(running)并不意味着进程一定处于运行当中,运行状态表明一个进程要么在运行中,要么在运行队列里。

2.2可中断睡眠状态-浅度睡眠状态-S

浅度睡眠状态(sleeping)意味着该进程正在等待某件事情的完成,处于浅度睡眠状态的进程随时可以被唤醒,也可以被杀掉(这里的睡眠有时候也可叫做可中断睡眠(interruptible sleep))。

等同于状态概念中的阻塞状态。        

我们来写段代码测试下:

 首先我们讲程序运行起来,查看一下进程的状态:

为什么是睡眠状态呢?

  • 首先我们知道CPU的运行速度非常快,那他执行printf这段代码的速度也是非常快的,但是printf会调用输出设备,这个过程就会处于阻塞状态(因为CPU的速度远高于输出设备),另外sleep函数也是会处于睡眠状态,所以虽然该进程大部分时间都是处于睡眠状态,而不是运行状态

处于S+状态时,该进程可用ctrl+c结束。

"+"代表是前台运行,无"+"代表后台运行,后台运行时可在命令行继续输入指令并执行,但无法用ctrl+c结束,需要用kill -9 pid杀死。想要后台运行某个程序就在后面加"&",如:./test &


2.3不可中断睡眠状态-深度睡眠状态-D

深度睡眠状态/不可中断睡眠状态/磁盘休眠状态,顾名思义,在这个状态的进程不会被杀掉,哪怕是操作系统也不行,通常会等待IO的结束。

例如,某一进程要求对磁盘进行写入操作,那么在磁盘进行写入期间,该进程就处于深度睡眠状态,是不会被杀掉的,因为该进程需要等待磁盘的回复(是否写入成功)以做出相应的应答。

如果在这个过程中,操作系统能够杀死该进程,那么就有可能丢失数据。

该状态也属于阻塞状态。


2.4停止状态-T

Linux中,操作系统为了防止一些进程做某种危险操作,可能会将进程设置为暂停状态。

我们可以利用SIGSTOP信号使进程进入暂停状态(stopped),发送SIGCONT信号可以让处于暂停状态的进程继续运行。

该状态也属于阻塞状态。 


2.5死亡状态-X

死亡状态只是一个返回状态,当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了,所以你不会在任务列表当中看到死亡状态,死亡状态是一个瞬时过程,我们很难查看到。


2.6僵尸状态-Z

僵尸状态就是在等待退出信息被读取时所处的状态。

在这一状态的进程我们称之为僵尸进程

利用代码进行观察:


为什么要有僵尸状态?

  • 创建进程是希望这个进程给用户完成工作的,子进程必须有结果数据保存在自己的PCB中,在该子进程死亡之前,必须要有父进程读取这些结果数据,读取成功后,子进程才能死亡。

2.6.1僵尸进程的危害

  • 僵尸进程的退出状态必须一直维持下去,因为它要告诉其父进程相应的退出信息。可是父进程一直不读取,那么子进程也就一直处于僵尸状态。
  • 僵尸进程的退出信息被保存在task_struct(PCB)中,僵尸状态一直不退出,那么PCB就一直需要进行维护。
  • 若是一个父进程创建了很多子进程,但都不进行回收,那么就会造成资源浪费,因为数据结构对象本身就要占用内存。
  • 僵尸进程申请的资源无法进行回收,那么僵尸进程越多,实际可用的资源就越少,也就是说,僵尸进程会导致内存泄漏。

2.7孤儿进程

孤儿进程与僵尸进程的情况刚好相反,当子进程的父进程先于子进程退出,那么将来子进程进入僵尸状态时就没有父进程对其进行处理,此时该子进程就称之为孤儿进程。

当出现孤儿进程时,该进程会被1号进程领养(可以认为是操作系统),此后当孤儿进程成为僵尸进程时就由1号进程对其进行读取。


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

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

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

相关文章

零拷贝的方式以及理解

零拷贝的方式以及理解 DMAmmapsendfilesendfile DMA scatter / Gatherdirect I/O 上一篇: 什么是零拷贝 DMA 正常的IO流程中,不管是物理设备之间的数据拷贝(比如:磁盘到内存),还是内存之间的数据拷贝(比…

rv1126-rv1109-以太网功能-eth-(调试篇)

先参考:以太网常见问题处理方法排查手册.pdf 调试指令: 1.首先dts修改 参考:Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdf 2.芯片地址尝试匹配 0~3地址都试下 &mdio { phy: phy0 { compatible "ethernet-phy-ieee802.3-c22"; reg <0…

C++之STL算法(1)

STL容器算法主要由、、组成&#xff1b;   algorithm主要有遍历、比较、交换、查找、拷贝、修改等&#xff1b; 1.遍历容器for_each for_each()函数用于完成容器遍历&#xff0c;函数参数如下&#xff1a; for_each(_InIt _First, _InIt _Last, _Fn _Func) 形参&#xff1a…

中伟视界:煤矿行业借力人工智能,防控灾害风险迈出新步伐 《“十四五”矿山安全生产规划》(应急(2022)64号),煤矿重大灾害风险防控系统

随着煤矿行业的发展&#xff0c;煤矿重大灾害风险防控成为了行业关注的重点之一。为了更好地预防和应对灾害风险&#xff0c;煤矿行业开始引入人工智能分析算法和检测场景&#xff0c;以提高灾害风险的识别和预警能力。 在煤矿的重大灾害风险防控中&#xff0c;AI算法发挥着重要…

MachMap:End-to-End Vectorized Solution for Compact HD-Map Construction

参考代码&#xff1a;None 动机与出发点 地平线的MapTR展现出了构建高精地图的能力&#xff0c;但是它的机制确实是有点复杂了。为了兼容不同车道线的朝向&#xff0c;环形车道线的起终点等情况&#xff0c;针对性设计了permute-equal的匹配逻辑&#xff0c;这样的逻辑真的是太…

VMWARE虚拟机无法正常复制粘贴

解决办法&#xff1a; 只要你拿25块钱给我&#xff0c;我立刻协助你完成这个任务&#xff0c;而且帮助你做到可以复制粘贴文件哈哈哈&#xff0c;搞不好不要钱&#xff0c;微信付款 我仔细看了&#xff0c;全网没有一个全面的解决方法&#xff0c;我这个是最全面的

以csv为源 flink 创建paimon 临时表相关 join 操作

目录 概述配置关键配置测试启动 kyuubi执行配置中的命令 bug解决bug01bug02 结束 概述 目标&#xff1a;生产中有需要外部源数据做paimon的数据源&#xff0c;生成临时表&#xff0c;以使用与现有正式表做相关统计及 join 操作。 环境&#xff1a;各组件版本如下 kyuubi 1.8…

【Kubernetes】存储类StorageClass

存储类StorageClass 一、StorageClass介绍二、安装nfs provisioner&#xff0c;用于配合存储类动态生成pv2.1、创建运行nfs-provisioner需要的sa账号2.2、对sa授权2.3、安装nfs-provisioner程序 三、创建storageclass&#xff0c;动态供给pv四、创建pvc&#xff0c;通过storage…

智能优化算法应用:基于阴阳对算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阴阳对算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阴阳对算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阴阳对算法4.实验参数设定5.算法结果6.参考文…

近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https,导致服务端302强制跳转到http也没反应

关于Chrome更新http强制跳转到https解决方法 近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https&#xff0c;导致服务端302强制跳转到http也没反应一、F12检查加载的Response Headers中有没有Non-Authoritative-Reason二、找了资料后得到解决方案&#xff1a;三、找…

java之“为什么需要数据类型?基本数据类型有哪些?数据类型的应用?”

java之“为什么需要数据类型&#xff1f;基本数据类型有哪些&#xff1f;数据类型的应用&#xff1f;” 一、eclipse操作示例1、完整代码2、运行效果 一、eclipse操作示例 1、完整代码 本文通过利用代码和注解的结合来回答“在java中为什么需要数据类型&#xff1f;基本数据类…

产品入门第一讲:Axure的安装以及基本使用

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…