Linux---进程状态

news2025/2/5 8:04:40

目录

一、系统进程状态介绍 

 1.运行状态

2.阻塞状态

3.挂起状态

二、Linux中的进程状态

1.R (running)

2.S (sleeping)

3.D(disk sleep)

4.T(stopped)

5.t(tracing stop)

6.X(dead) 

7.Z(zombie)

三、孤儿进程


一、系统进程状态介绍 

上图是对进程状态的笼统的概念,具体在不同的操作系统中的表现是有差异的。

这里先简单解释一下进程状态在操作系统中是如何表示的:进程状态其实就是每个进程所对应的PCB结构体中的一个字段,用整形表示,如下图:

 1.运行状态

每个CUP都会有一个对应的运行队列,上面有进程等待被调度执行

只要在运行队列中的进程,都是运行状态。

注意:这里的运行状态包括了就绪,执行,在现在的操作系统中,我们对这几个状态的区分不在那么明确了

2.阻塞状态

在我们过去写过的代码中,都或多或少访问过外设,就拿scanf输入举个例子,当我们的代码执行到该条语句时,会停下来,等待我们从键盘出入数据,那么如果我们一直不输入,它就会一直等待,这种时候,进程所处的状态就是阻塞状态。

所以进程状态变化的本质:1.pcb状态字段的值发生变化 2.pcb从一个队列到另一个队列 

那么进程阻塞,我们能"宏观"看到什么?当我们在电脑上打开多个下载任务,同时还在刷视频的时候,会发现很卡,为什么?因为网卡的资源需要被很多进程访问,进程的状态不停的在运行和阻塞之间切换,而这种状态的转变通过卡顿的方式呈现了出来。

3.挂起状态

如果一个进程当前被阻塞了,注定了,这个进程在等待资源的时候,是无法被调度运行的,如果此时,恰好操作系统内的内存资源已经严重不足了,怎么办?

操作系统为了防止自己挂掉,会将该进程的数据和代码先交换到磁盘当中,释放部分内存资源

  • 将内存数据进行置换到外设,是针对所有阻塞进程的
  • 不同担心和磁盘交互慢的问题,现在的主要矛盾是系统快要挂掉了,需要让系统继续执行下去
  • 磁盘中有swap分区---操作系统内的数据会被置换到这里
  • 当进程再次被操作系统调度,被置换出去的数据和代码,会被重新加载到内存

这就是阻塞挂起,当然还有其他的挂起(只要当前进程没有被调度,就能被挂起),如就绪挂起等,但是这些挂起被调度的可能性很高,会出现大量的和外设之间的数据交互,降低操作系统的速度

注意:swap分区不能太大,会导致操作系统太过于依赖置换操作,导致操作系统变慢

二、Linux中的进程状态

1.R (running)

当我们在循环打印语句的时候,会发现进程的状态几乎都在S,而不在R,但是我们能看到屏幕在不停的刷Hello world,为什么?其实是因为CPU太快了,进程的状态基本在等待打印,从侧面说明IO(输入输出)相较于CPU是很慢的

而当我们只循环,不打印的时候,进程就一直处于R运行状态,本质是循环判断是CPU执行的,所以进程一直在CPU上运行

这里说明一下+表示该进程是前台进程,特点:能被ctrl+C终止,且bash命令行失效,即不能再执行输入的命令,后台进程的特点与之相反

 2.S (sleeping)

休眠状态,浅度睡眠,可以被终止,能对外部信号做出响应。属于阻塞状态的一种。

3.D(disk sleep)

深度睡眠,不能被终止(即操作系统没有能力杀掉这个进程),也属于阻塞状态的一种。

那么为什么要设计这个状态呢?

主要是防止下面这种情况的发生:当进程向磁盘写入数据时,恰好操作系统太忙了,快要挂掉了,这时Linux操作系统会采取杀掉进程的方式来缓解压力,而该进程正好处于阻塞状态被杀掉,但是数据写入失败,这时数据就会被丢弃,造成损失。

所以我们需要设计一个状态不能被杀掉,只能等它完成任务自动醒来,这就是深度睡眠状态

这个状态一般很难观察到,一旦观测到有好几个进程处于D状态,就说明操作系统快挂了

4.T(stopped)

上面的是进程信号,我们可以用18和19两个信号来控制进程的停止和继续(其他的信号我们暂且不管,有兴趣的可以去百度)

一般进程在访问软件资源的时候,可以暂时不让进程进行访问,会将进程设置为T状态

5.t(tracing stop)

当我们在调试程序时,给程序设置断点在运行到断点,程序停止之后的状态就是t状态,需要等待软件资源就绪,也就是说gdb会给程序发送信号,而为什么一个进程能等待另一个进程的资源就绪, 本质是因为进程pcb中也存在进程等待队列

6.X(dead) 

死亡状态,也就是终止状态,这是个瞬时状态。

7.Z(zombie)

僵尸状态,就是进程死亡之前的一个状态,用来回收该进程的退出信息,简单来说就是进程运行结束后,我们需要知道该进程的任务完成的怎么样,所以该进程的pcb不会立即释放(该进程的代码和数据可以释放,OS会将它的退出信息写入它的pcb中),需要等待它的父进程回收这些退出信息后,才能释放,这个过程的状态就叫僵尸状态。

我们写main函数都会在最后return 0,就是告诉操作系统,该进程成功结束了,当然也可以返回1,2,3等等,用来表示一些退出信息

下面给大家演示一下僵尸状态

当父进程不去回收子进程的退出信息的时候,子进程会一直处于僵尸状态,造成内存泄漏

三、孤儿进程

上面的僵尸进程,是子进程结束,父进程不回收子进程的退出状态引发的,那如果父进程先退出,子进程又会怎么样呢?

当父进程退出后,bash进程会将父进程的退出信息回收,所以父进程能被正常退出,但是子进程没有被退出,这时它就成了孤儿进程,要被1号进程(操作系统)领养,这里要注意父进程只会对子进程的负责,所以bash作为子进程的爷爷进程,不会回收它,所以子进程依旧不会终止,而是被操作系统领养(这里的父进程和子进程特指代码中父子进程,bash进程和父进程具有父子关系,所以称bash为子进程的爷爷进程) 

如果子进程不被领养,那么一旦子进程结束,它的退出信息就无法被回收,该进程就会处于僵尸状态,无法正常退出,造成内存泄漏

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring AOP入门指南:轻松掌握面向切面编程的基础知识

面向切面编程 1,AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2,AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给…

短剧分销平台搭建,稳占短剧市场

近两年,短剧一时火爆出圈,凭借着跌宕起伏的剧情成为了影视观众的新宠。短剧的剧情非常短,但每一集都能有一个高潮部分,非常吸引大众观看。 为了解锁更多短剧,观众更是对其进行付费充值,甚至还出现了24小时…

Java:打印当前线程的堆栈信息到错误流(error stream)

使用java.lang.Thread的静态方法dumpStack(),可以打印当前线程的堆栈信息到错误流(error stream)。 代码示例: package com.thb;public class Test5 {public static void main(String[] args) {Thread.dumpStack();}}运行输出&a…

基于SpringBoot的考研专业课程管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

JFreeChart 生成图表,并为图表标注特殊点、添加文本标识框

一、项目场景: Java使用JFreeChart库生成图片,主要场景为将具体的数据 可视化 生成曲线图等的图表。 本篇文章主要针对为数据集生成的图表添加特殊点及其标识框。具体包括两种场景:x轴为 时间戳 类型和普通 数值 类型。(y轴都为…

SpringMVC:执行原理详解、配置文件和注解开发实现 SpringMVC

文章目录 SpringMVC - 01一、概述二、SpringMVC 执行原理三、使用配置文件实现 SpringMVC四、使用注解开发实现 SpringMVC1. 步骤2. 实现 五、总结注意: SpringMVC - 01 一、概述 SpringMVC 官方文档:点此进入 有关 MVC 架构模式的内容见之前的笔记&a…

VM——计算流程执行耗时

1、计算同一个流程内的耗时,可以直接用“耗时统计”模块; 2、计算多个流程的运行耗时,需要使用“脚本”,利用C#函数计算耗时 首先,记录起始时间,保存到string类型的全局变量中, curTmStr Dat…

c#委托学习笔记1

委托三步骤 第一步:定义委托 //第一步:1 声明委托(定义委托) //对于声明委托的解释如下: //解释a:函数指针 //解释b:委托就是定义函数的形状(形态) // 即:返回值类型&#x…

php学习01-Hello World

开发环境搭建 参考 如果没有搭建的请参考上面的文章进行搭建 新建index.php <?php echo Hello World; ?>访问 修改index.php代码 <?php phpinfo() //主要是用来打印php的一些配置信息方便后期排查配置是否正确以及插件是否开启 ?>

conda环境下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

3分钟看懂如何给开源项目发起提案

背景 前段时间在使用 Pulsar 的 admin API 时&#xff0c;发现其中的一个接口响应非常慢&#xff1a; admin.topics().getPartitionedStats(topic); 使用 curl 拿到的响应结果非常大&#xff0c;同时也非常耗时&#xff1a; 具体的 issue 在这里&#xff1a;https://github.…

idea 远程调试linux上的代码

背景介绍 开发过程中&#xff0c;我们经常会遇到部署的代码运行出问题、看日志由不是很直观、我们希望可以像调试本地代码一样去调试远程代码; IDEA提供了Remote工具,基于JVM的跨平台能力&#xff0c;我们可以远程调试部署的代码。 前提 保证远程和本地跑的代码是一致的 操…

陶建辉在 CIAS 2023 谈“新能源汽车的数字化”

近年&#xff0c;中国的新能源汽车发展迅猛&#xff0c;在全球竞争中表现出色&#xff0c;已经连续 8 年保持全球销量第一。在新兴技术的推动下&#xff0c;新能源汽车的数字化转型也正在加速进行&#xff0c;从汽车制造到能源利用、人机交互&#xff0c;各个环节都在进行数字化…

Pooling方法总结(语音识别)

Pooling layer将变长的frame-level features转换为一个定长的向量。 1. Statistics Pooling 链接&#xff1a;http://danielpovey.com/files/2017_interspeech_embeddings.pdf The default pooling method for x-vector is statistics pooling. The statistics pooling laye…

2024海外社媒营销新趋势,品牌出海如何做?

社交媒体在网上的影响力是毋庸置疑的。投资社交媒体平台并建立公司形象&#xff0c;提高产品运营收入&#xff0c;提升品牌知名度&#xff0c;对于吸引对您所提供的产品感兴趣的人至关重要。 然而&#xff0c;社交媒体格局总是在变化&#xff0c;这意味着您需要掌握新的社交媒…

LeetCode Hot100 295.数据流的中位数

题目&#xff1a; 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始…

Java:获取线程组的最大优先级

java.lang.ThreadGroup的getMaxPriority()函数返回该线程组的最大优先级。这个最大优先级就等于该线程组中新创建线程的最大优先级。 代码示例&#xff1a; package com.thb;public class Test5 {public static void main(String[] args) {ThreadGroup threadGroup Thread.c…

转义字符使用详解【C语言】

目录 转义字符的概念 转义字符表 转义字符详解 和 实际使用示例 一、\a 二、\b 三、\f 四、\n 五、\r 六、\t 七、\v 八、\\ 九、\ 十、\" 十一、\? 十二、\0 十三、\ddd 十四、\xhh 总结—— 转义字符的概念 所有的 ASCII码都可以用“\加数字” 来表示…

【C语言刷题每日一题#牛客网BC69】——空心正方形图案

目录 问题描述 思路分析 代码实现 结果测试 问题描述 思路分析 首先根据输入的描述&#xff0c;多组输入需要将scanf放在循环中来实现分析输出的规律&#xff1a;当输入为4时&#xff0c;分别在第0行和第3行&#xff08;4-1行&#xff09;&#xff0c;第0列和第3列&#xf…

Sentinel 流量治理组件教程

前言 官网首页&#xff1a;home | Sentinel (sentinelguard.io) 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形…