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工具开发,本系统主要分为用户,企业,管理员三个角色,用户注册登陆小程序,查看应聘分类ÿ…...
亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )
专栏:高并发---前后端分布式项目 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、…...
为什么这11道JVM面试题这么重要(附答案)
本文内容整理自 博学谷狂野架构师 运行时数据区都包含什么 虚拟机的基础面试题 程序计数器Java 虚拟机栈本地方法栈Java 堆方法区 程序计数器 程序计数器是线程私有的,并且是JVM中唯一不会溢出的区域,用来保存线程切换时的执行行数 程序计数器ÿ…...
概率统计之概率篇
概率统计之概率篇 一 随机变量及其四种研究方法 为了更深入地研究随机现象,需要把随机试验的结果数量化,也就是要引进随机变量来描述随机试验的结果。 一般地,把表示随机现象的各种结果或描述随机事件的变量叫做随机变量。随机变量通常用大…...
综合项目 旅游网 【5.旅游线路收藏功能】
分析判断当前登录用户是否收藏过该线路当页面加载完成后,发送ajax请求,获取用户是否收藏的标记根据标记,展示不同的按钮样式编写代码后台代码RouteServlet/*** 判断当前登录用户是否收藏过该路线*/ public void isFavorite(HttpServletReques…...
【ArcGIS Pro二次开发】(3):UI管理_显示隐藏Tab、Group、Control等控件
在ArcGIS Pro工作中,有时候会涉及到工具栏UI的管理,比如,打开模型构建器时,工具栏才会出现新的选项卡(Tab)【ModelBuilder】,工程未做更改,则【保存】按钮显示灰色不可用。 下面以一个小例子来学习一下。 一…...
Spring Boot开发实战——echarts图标填充数据
echarts模块的导入 先看看成品吧! 有的图标的数据用了一些计算框架不是直接查数据库所以有点慢。 ok!😃 上正文,接上节Spring boot项目开发实战——(LayUI实现前后端数据交换与定义方法渲染数据)讲解了一般…...
李达聪老师:互联网时代的B2B品牌如何塑造
李达聪老师:互联网时代的B2B品牌如何塑造互联网时代企业对企业的品牌如何塑造?互联网时代信息传播速度加快,并且各大新品牌就如春天的竹笋涌出,有的昙花一现,有的趁着时代的红利乘胜追击占领市场,建立品牌。有的成为一…...
javaEE 初阶 — 连接管理机制
文章目录连接管理机制1. 建立连接(三次握手)2. 断开连接(四次挥手)TCP 的工作机制确认应答机制 超时重传机制 连接管理机制 比如 主机A 的空间存储了 主机B 的 ip 和 端口,主机B 的空间存储了 主机A 的 ip 和 端口。…...
40个改变你编程技能的小技巧!
40个改变编程技能的小技巧 1、将大块代码分解成小函数 2、今日事今日毕,如果没毕,就留到明天。 如果下班之前还没有解决的问题,那么你需要做的,就是关闭电脑,把它留到明天。 中途不要再想着问题了! 3、…...
iTOP3588开发板直连电脑配置方法(无线上网)配置主机IP
首先使用网线连接好主机和开发板,在没有上电的情况下,可以看到以太网显示网络电缆 被拔出,如下图所示: 当开发板上电以后,开发板网卡与笔记本电脑的网卡会连接,如下图所示: 然后右键点击以太网…...
压电陶瓷换能器导纳圆图公式推导及匹配
压电陶瓷换能器的等效电路图如下图所示,分为左右两个部分左边的电容和电阻并联构成了电路的静态支路,被称为静态电容,可以由电表很方便的测量得到,这部分的参数是由换能器的电学参数决定的。右边的串联构成了动态支路,…...
设计模式C++实现11:观察者模式
参考大话设计模式; 详细内容参见大话设计模式一书第十四章,该书使用C#实现,本实验通过C语言实现。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察…...
浙江市建设网站/优化网站标题名词解释
先创建一个分区,具体步骤参考这个链接然后挂载: 提示错误的话,试试 mount -t ext4 /dev/sdb4 /mnt/sdb4/...
计算机网站建设体会/网站seo优化课程
BINLOG就是一个记录SQL语句的过程,和普通的LOG一样。不过只是她是二进制存储,普通的是十进制存储罢了。1、配置文件里要写的东西:[mysqld]log-binmysql-bin(名字可以改成自己的,如果不改名字的话,默认是以主机名字命名…...
那些平台可以给网站做外链/百度网站排名搜行者seo
概述 AT模式运行机制 AT模式的特点就是业务无侵入式,整体机制分二阶段提交 两阶段提交协议的演变: 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。二阶段: 提交异步化,非…...
wordpress 多站点配置/网站免费推广平台
编译CoreCLR需要Clang 3.5,而CentOS上安装的是Clang 3.4.2(yum repos中最新版也是这个),只能自己手工编译LLVM的源代码进行安装。 (注:CentOS的版本是6.6) 一、安装libstdc4.7 (注:如果是CentOS 7.0&#x…...
wordpress 悬浮框/域名免费注册0元注册
成员变量:是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。类变量:也声明在类中,方法体之外,但必须声明为static类型。1.生命周期不同成员变…...
12306网站哪个公司做的/百度开发平台
上一篇搭建部署了Jumpserver,但是还未彻底完成,这篇继续接着上一篇搭建部署Jumpserver。 1、test-env hostname ip role cs74s 192.168.10.15 server systemctl stopNetworkManager systemctl disableNetworkManager systemctl stopfirewalld …...