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

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...