当前位置: 首页 > 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…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...