当前位置: 首页 > news >正文

Linux进程状态

Linux进程状态

  • 前言
  • 阻塞
  • 挂起
  • Linux进程状态
    • R运行状态
    • S睡眠状态
    • D磁盘休眠状态
    • T停止状态
    • X死亡状态
    • Z僵尸状态
    • 僵尸进程的总结

前言

在介绍Linux的进程状态之前,我们先做一个小调查:
正在运行的程序是一直在运行吗?或者说正在运行的程序一直在被cpu处理吗?
答案是:当然不是!!
正在运行的程序并不是一直在被cpu执行的,如果cpu是把某个程序执行完在执行下一个程序的话,效率是非常低的!同时我们也无法完成边听歌边打游戏的操作!cpu采用的是分时的操作,就是说对于每一个程序cpu都会只执行一小段时间,到时间了就切换去执行下一个程序,由于cpu的切换时间太快了,我们人类是无法感受出来的,这就会造成我们感官上认为多个程序在同一时间运行!但是实际上cpu还是一个一个的执行程序的!
如果我们在内存中加载多个程序的话,cpu在多个程序之间就会调度不过来,在我们用户层面就会发现程序会变得卡顿!

同时再具体介绍Linux进程状态之前,我们先来介绍两个概念:阻塞和挂起;

阻塞

概念:进程因为等待某种条件就绪,而导致一种不推进的状态;

这个概念很抽象,简单来说就是进程卡住了;

那么进程为什么要阻塞呢?
阻塞一定是为了等待某种资源;换而言之进程要等待别的进程使用完资源后,自己再去使用;

因此我们可以重新定义一下阻塞的概念:

阻塞: 进程为了等待某种资源就绪的过程;

我们下面举个具体的例子,来帮助我们理解阻塞:
就比如此时有个cpu和进程:
在这里插入图片描述

cpu正在执行该进程的指令时,发现该进程需要向屏幕上输出某些资源,cpu就对进程说:“进程啊,现在你需要使用屏幕资源,但是你又没有,你先去向屏幕申请一下,等你拿到了屏幕资源时,再来找我”,进程答应了,于是cpu就去处理下一个进程了,那么这个进程是如何去申请屏幕资源的?
我们知道os是款搞管理的软件,os自然也能管理:网卡、屏幕、键盘等硬件资源,但是os并不是直接管理这些硬件的,在Linux中OS 先描述 出每个硬件基本信息,并且将这些基本信息放入一个结构体中:
在这里插入图片描述
然后再利用某种数据结构将这些结构体再组织起来(假设使用的是链表这种数据结构),那么OS对于这些硬件的管理是不是就是对链表的增删查改,这不就很好的管理起硬件资源了;
既然硬件很好的管理起来了,那么这些硬件是如何知道那些进程在向它申请空间的?
实际上在存储硬件信息的结构体中,还有一个队列:
在这里插入图片描述

这个队列就专门用来记录需要申请该硬件资源的进程的pcb(并不是存储进程的代码数据,而是pcb,因为进程也是由OS管理的,OS的管理是不直接管理被管理对象本身的,而是将进程的信息抽象在pcb结构体中,os通过管理pcb来达到管理对应进程);
比如说:现在我的进程需要申请使用网卡资源,那么在存储网卡信息的结构体中的队列就会存储该进程的pcb;如果进程需要申请屏幕资源,那么在存储屏幕信息的结构体中的队列,就会存储该对象的pcb;
整个内存中有许多进程,可能不止我这一个进程需要申请网卡资源,因此我们的进程在申请网卡资源的时候需要在申请网卡资源的队列中进行等待,此时进程并没有被cpu调度,这个在网卡资源队列中等待资源的行为就是阻塞! 当这个等待的进程等到需要的资源时,该进程的pcb就会加载进cpu队列中,等待cpu的处理!

挂起

挂起状态可以说是一个特殊的阻塞状态;
我们具体用一个例子来说明:现在我们的进程需要使用网卡资源,cpu就会让该进程去先申请好了网卡资源,再来被cpu执行,于是该进程就加入了网卡资源的队列中,等待网卡资源的就绪,此时进程就是阻塞状态,但是此时内存空间有点不足了,OS在路过的时候看到我们的进程还在等待网卡资源,就会将我们进程在内存中的代码数据暂时转移到磁盘中去,以此来缓解此时的内存压力,虽然该进程的代码数据被转移到磁盘中去了,但是OS并不会销毁该进程对应的pcb,因此OS还是能管理到该进程的;此时进程处于的这种状态就叫做挂起状态;
当该进程分配网卡资源时,OS又会将该进程的代码数据从外存调回内存;
在这里插入图片描述

Linux进程状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
下面的状态在kernel源代码里定义:

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

R运行状态

R运行状态:并不一定表示进程正在被cpu处理,位于cpu的运行队列中的进程也可以被称为处于运行状态;
在这里插入图片描述

S睡眠状态

S睡眠状态:进程为了等待某种资源,而处于等待队列当中,实际上就是阻塞状态也被称为浅睡眠状态或可中断睡眠,该状态下的进程可以被杀掉!
我们可以写一断程序来观察S状态:
在这里插入图片描述
我们可以利用:ps axj或者ps aux 来查看当前进程的运行状态;
在这里插入图片描述
我们可以发现程序确实是存在于S状态,因为cpu在处理到printf语句时,需要该进程提供屏幕资源,该进程就会离开cpu去屏幕资源的等待队列中等待屏幕资源的分配,为此我们能看到进程处于S状态,该状态下的进程是可以被杀掉的!我们利用ctrl+c或者kill -9 pid来杀掉进程;
我们在上面的时候有提到进程是会被cpu执行的,那么我们为什么利用ps -axj命令显示出来的状态是S呢?而不是R?主要是因为cpu的处理速度非常快,当我们的进程把屏幕资源准备好过后cpu瞬间就完成了printf指令,然后又来到了printf,进程又要去屏幕资源的队列中等待分配屏幕资源,等待是需要花时间的,而这个等待时间与cpu处理时间比起来简直大了不知多少倍,就这么说在1s的时间中99.9%的时间花费在了等待资源分配的情况下,实际被cpu处理的时间不到0.1%;因此我们利用ps查看到的进程大多数时间都是处于S状态,极少数时间处于R状态,也就是说理论上我们还是可以捕获到进程处于R状态的,只不过成功几率很低!
在这里插入图片描述
除了这种拼手速作法捕获R状态,那么有没有什么办法让我们的进程处于R状态的几率增大呢?
当然可以,我们只要不在程序中申请资源,比如上面的进程是因为要申请屏幕资源,我们直接屏蔽掉printf就好了:
在这里插入图片描述
在这里插入图片描述

D磁盘休眠状态

D磁盘休眠状态:就是在阻塞状态的基础上,该进程不能被杀掉!只能等待该进程分配到资源,然后进程自然醒来或者重启计算机;不然处于D状态的进程会一直等待资源分配,我们利用kill命令也无法将其杀死,因此D状态也被称为不可中断状态一般情况下我们的计算机都不会出现这情况,一旦有进程处于这个状态,那么说明我们的计算机离宕机不远了!

T停止状态

T停止状态:可以利用kill命令向进程发送SIGSTOP信号来暂停进程;向进程发送SIGCONT信号让进程继续运行;
下面我们通过这个程序来观察T状态:
在这里插入图片描述
在这里插入图片描述
我们也可以发送继续的信号,让进程继续运行:
在这里插入图片描述
我们可以发现经过暂停过后的进程在恢复原状态时状态后面没有了+号;
那么这个+号表示什么呢?
如果一个进程的状态后面还跟了个+号,那么表明这个进程是个前台进程,我们此时无法输入Shell命令,但是我们可以通过Ctrl+c来杀掉该进程或者利用命令kill -9 pid;
如果一个进程的状态后面没有+号,表明这个进程是后台进程,此时我们可以正常输入Shell命令,但是在后台该进程也在运行!此时我们输入Ctrl+c就没有什么作用了,只能通过kill -9 pid的方式来杀掉该进程;

我们在调试程序的时候,如果我们不打断点,直接一个f5编译器就会跑完整段代码,但是当我们在中间打了断点过后,再按f5程序就会在断点处停下来;本质上打断点就是让进程处于暂停状态!
我们可以调试刚才的代码来测试:
在这里插入图片描述

在这里插入图片描述
t与T一样也是暂停状态!

X死亡状态

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

Z僵尸状态

Z僵尸状态:进程一般情况下并不会直接被杀掉,因为当子进程完成它的任务过后,需要向父进程报告它的工作完成的怎么样,而子进程是通过返回进程退出码来告诉父进程的,如果父进程接受了该码,子进程才会被释放!如果父进程没有接受子进程的进程退出码那么子进程就会一直占用着内存资源,得不到释放,此时子进程的这种状态就是僵尸状态;
僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
下面我们通过一段代码来演示僵尸进程:
在这里插入图片描述
在这里插入图片描述

主要是因为在父进程中,我们并没有接受子进程的进程退出码!导致子进程无法正常释放空间!

僵尸进程的总结

1、僵尸进程存在的意义就是告诉父进程你交给我的任务,我子进程工作的怎么样,如果父进程一直不读取子进程的进程退出码的话,子进程就会变成僵尸进程;
2、维护状态本身也是需要存储数据的,也属于进程的基本信息,所以也保存在pcb中,如果Z状态一直不退出,pcb一直都需要维护;
3、如果一个父进程创建了很多子进程,但是父进程就是不回收子进程,那么在内存中就会存在大量僵尸进程,这些僵尸进程的代码数据也是需要存储的,也是需要消耗大量内存的,如果我们一直不回收,僵尸进程就会一直占这这些内存,会造成内存泄漏!

相关文章:

Linux进程状态

Linux进程状态前言阻塞挂起Linux进程状态R运行状态S睡眠状态D磁盘休眠状态T停止状态X死亡状态Z僵尸状态僵尸进程的总结前言 在介绍Linux的进程状态之前,我们先做一个小调查: 正在运行的程序是一直在运行吗?或者说正在运行的程序一直在被cpu处…...

大数据第一轮复习笔记

linux: 添加用户 useradd 删除用户 userdel useradd -d指定组 添加组 groupadd 删除组 groupdel 创建目录 mkdir -p 删除目录 rm -rf 创建目录 touch cat -n 查看文件(显示行号)...

HTML面试题

HTML面试题部分知识点梳理 1.如何理解HTML语义化 让页面的内容结构化,便于对浏览器、引擎解析,易于阅读,便于维护理解,利于SEO。 2.H5的新特性 video/audio视频/音频canvas 绘画geolocation 定位 用于定位用户的位置WebSocket…...

CUDA内存管理一文理清|参加CUDA线上训练营

CUDA 内存概述 GPU的内存包括: 全局内存(global memory)常量内存(constant memory)纹理内存核表面内存(texture memory)寄存器(register)局部内存(local me…...

Transformation(转换算子)

分布式代码的分析 启动spark程序的代码 在yarn中启动(没有配置环境变量) /export/server/spark/bin/spark-submit --master yarn --num-executors 6 /root/helloword.py # 配置环境变量 spark-submit --master yarn --num-executors 6 /root/helloword.py RDD的五大特征 1、…...

总结如何设计一款营销低代码可视化海报平台

背景 我所在的部门负责的是活动业务,每天都有很多的营销活动,随之而来的就是大量的H5活动页面。而这些H5活动已经沉淀出了比较固定的玩法交互,我们开发大多数的工作也只是在复制粘贴这种大量的重复工作。 在基于此背景下我开始了低代码平台…...

spark04-文件读取分区数据分配原理

接 https://blog.csdn.net/oracle8090/article/details/129013345?spm1001.2014.3001.5502通过上一节知道 总字节数为7 每个分区字节数为3代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext ne…...

常见的网络安全攻击及防御技术概述

网络安全技术涉及从物理层到业务层的各个层面,贯穿产品设计到产品上线运营的全流程。现阶段网络攻击的方式和种类也随着互联网技术的发展而不断迭代,做好网络安全防护的前提是我们要对网络攻击有充分的了解。下文将抛砖引玉对常见的网络安全攻击及防御技…...

NetSuite Balancing Segment平衡段

春节假期偷了一段时间懒,现在开始工作了。今朝谈一个偏门题目,于未知领域再下一城。说这个题目偏,就要讲讲渊源。话说在Oracle的EBS和Fusion产品中的COA领域有个功能叫做“Balancing Segment”。 问了几位Oracle老炮,也说是对第二…...

Docker 中遇到的问题

1:docker-tomcat 篇 第一天启动主机和虚拟机都可以正常访问,晚上睡觉的时候就挂起关机睡觉了,但到了第二天主机访问不了了,ping 也能ping 通,后来停掉容器,重启了虚拟机就好了,就很离谱。 这是成…...

树莓派用默认账号和密码登录不上怎么办;修改树莓派的密码

目录 一、重置树莓派的默认账号和密码 二、修改树莓派的密码 三、超级用户和普通用户的切换 一、重置树莓派的默认账号和密码 在SD卡中根目录建立文件userconf 在userconf中输入如下内容: pi:$6$/4.VdYgDm7RJ0qM1$FwXCeQgDKkqrOU3RIRuDSKpauAbBvP11msq9X58c8Q…...

【LeetCode】不同的二叉搜索树 [M](卡特兰数)

96. 不同的二叉搜索树 - 力扣(LeetCode) 一、题目 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出&a…...

【软件相关】文献管理工具——Zotero

文章目录0 前期教程1 前言2 一些说明3 下载安装4 功能一:插入文献引用格式5 功能二:从网页下载文献pdf和题录6 功能三:数据多平台同步7 功能四:通过DOI添加条目及添加订阅8 安装xpi插件9 功能五:智能识别中英文文献10 …...

leetcode练习一:数组(二分查找、双指针、滑动窗口)

文章目录一、 数组理论基础二、 二分查找2.1 解题思路2.2 练习题2.2.1 二分查找(题704)2.2.2 搜索插入位置(题35)2.2.3 查找排序数组元素起止位置(题34)2.2.4 有效的完全平方数(题367)2.2.5 x 的平方根&…...

iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?

在升级最新的 iOS 16.3 系统后,有些用户可能遇到了个别应用无法正常打开,卡死的异常情况。大家可以尝试通过如下方式解决问题。 1.重新启动应用: 如果应用出现卡死或闪退,可从 iPhone 屏幕由底往上滑(或连续按两次 H…...

TCP协议原理一

文章目录一、TCP协议二、TCP工作机制1.确认应答2.超时重传3.连接管理三次握手四次挥手一、TCP协议 我们的TCP协议相比于UDP协议复杂不少,今天我们就来一起学习一下TCP协议报文和原理 首先我们报头第一行里的端口号和UDP的端口号是一致的,都是用两个字节…...

【黑马SpringCloud(6)】Sentinel解决雪崩问题

微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头…...

微信小程序 java springboot招聘求职应聘简历系统

应聘系统是基于微信小程序,java编程语言,mysql数据库,springboot框架,idea工具开发,本系统主要分为用户,企业,管理员三个角色,用户注册登陆小程序,查看应聘分类&#xff…...

亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )

专栏:高并发---前后端分布式项目 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、…...

为什么这11道JVM面试题这么重要(附答案)

本文内容整理自 博学谷狂野架构师 运行时数据区都包含什么 虚拟机的基础面试题 程序计数器Java 虚拟机栈本地方法栈Java 堆方法区 程序计数器 程序计数器是线程私有的,并且是JVM中唯一不会溢出的区域,用来保存线程切换时的执行行数 程序计数器&#xff…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...