Linux4.5、进程状态

个人主页:Lei宝啊
愿所有美好如期而遇
目录
进程状态介绍
Linux下具体进程状态
R状态 和 S状态
D状态
T状态
t状态
Z状态
X状态
进程状态介绍
首先,进程状态有运行,阻塞,挂起,这些只是一个大体的概括,具体的状态我们后面会一一说到。
我们知道,task_struct是Linux进程控制块,实际上我们的进程状态值就定义在里面,在进程状态改变的时候,只需要改变它的值即可。

那么进程状态决定了什么呢?他决定了进程的后续动作,是继续执行,还是终止,如果多个进程都已经就绪,都需要执行,但是我们只有一个CPU,不可能同时执行,于是就有了进程排队,
关于进程排队,参考:进程排队
https://blog.csdn.net/m0_74824254/article/details/134549038?spm=1001.2014.3001.5501
运行状态:不是只有正在CPU上执行的进程才是运行状态,而是只要在CPU运行队列上的进程就处于运行状态。
阻塞状态:程序在等待某种软硬件资源时,就会从运行队列迁移到等待队列,此时就是阻塞状态。
挂起状态:在计算机资源吃紧,也就是运行内存不够时,为了保证操作系统不会挂掉,以及大部分进程仍然能够继续跑下去,会将一些进程的代码和数据先唤出到磁盘上的swap分区,腾出一部分内存空间。
我们这里只提及阻塞挂起。
在一些进程等待某些硬件资源,但是硬件资源没有就绪,计算机资源此时又非常吃紧,如果不及时清理内存空间,就会崩掉,到时候谁也别想运行,那么此时处于阻塞状态的进程就是非常好的清理对象,占着内存空间,然后还不运行,此时操作系统就会将他唤出到磁盘上的swap分区。

当操作系统顶住了这波压力,内存没那么吃紧的时候,我们这个进程的硬件资源也就绪了,task_struct迁移到了运行队列,要被CPU执行时,操作系统就会将他的代码和数据从磁盘上的swap分区上唤入。
我们要提及的是唤出时,进程的task_struct不会被唤出,如果他被唤出,那么谁来记录这个进程的数据,我怎么知道你被唤出了,什么时候唤回来,所以我们的进程在创建时,也是先创建task_struct进程控制块,然后再将他的代码和数据加载进内存。我们说,一个进程要想运行,首先要加载到内存中被操作系统所管理,而要被操作系统所管理,就要先描述,再组织,也就是先创建他的PCB,在将他组织进一个数据结构,我们将来对进程的管理,也就转变成了对这个数据结构的增删查改。
再一个问题,swap分区的大小一般来说和内存大小相同,或者是内存的一半,如果swap分区过大,那么操作系统会依赖这个分区,因为他很大,我们理解成操作系统要将分区填满,所以操作系统一但有阻塞进程,就会把他的代码和数据唤出,或者其他状态下的进程唤出,而相对于CPU和内存交互的速度来说,内存向外设写入代码和数据的速度并不快,这样频繁的唤出,必然会导致整体效率的下降,以及整个操作系统的卡顿。
我们这里只是片面的提及挂起,挂起还有运行挂起等等,同时操作系统在计算机吃紧的时候,不会只去清理进程,还会去清理文件等等其他资源,这里我们只是管中窥豹来了解一下挂起。
所以最后,进程状态的本质,其实就是进程在不同队列的迁移,在运行队列,就是运行状态,在等待队列,就是等待状态,而队列迁移,状态也就改变,status这个变量的值也就改变了。(这里可以参考进程排队)
Linux下具体进程状态
接下来我们会具体说到Linux下进程的状态具体是怎样的
这是Linux内核的源代码
我们挨个介绍
R状态 和 S状态
R (running) 运行状态
S (Sleeping) 可中断睡眠状态


要说明的是博主开了两个窗口,不是一个窗口执行,为了字体大小方便读者看清,下面的图都是以一个窗口形式展现的,我们将编号,左边是零号窗口,执行和更改代码,右边是一号窗口,用于查看进程,以及杀死进程。


我们发现我们运行的程序处于S状态,(+号一会解释),为什么不是R状态呢?难道是因为进程执行太快了,我们还有sleep休眠1秒所导致的吗?我们去掉sleep。


CPU开始疯狂执行,这行代码开始刷屏,现在进程是什么状态呢 ?

为什么?我们知道printf是个输出函数,要执行他需要访问显式器,显示器是个硬件,访问他必然不会快,而CPU的执行又很快,于是进程到了运行队列,很快执行后,迁移到显示器的等待队列等待响应,这个过程相对于CPU来说就很慢了,于是我们在查询进程时,几乎都是阻塞状态,也就是S。
那么那个+号是什么意思?
这样有+号的进程就是前台进程,执行起来可以中断,输入指令不可执行。

这样执行起来的进程就是后台进程,执行起来不可中断,同时输入指令是可以执行的。

那我们怎么中断这个进程呢?使用指令kill -9 pid

-9是信号,意为杀死进程。
![]()

这个进程就被杀死了。
我们再运行一次查看他的状态,是S,也就是后台进程。

那么我们在删掉printf语句,能不能出现R状态呢?



D状态
D (disk sleep) 不可中断进程
这个我们无法演示,但是可以说明,这个状态也叫做磁盘休眠,也就是说一个进程在内存向磁盘写入代码和数据时, 该进程无法被操作系统终止回收,即使计算机资源吃紧,也不可唤出或者杀死。
需要说到的是,如果你的电脑能够查到这个状态,说明你的磁盘已经很满了,操作系统和你的计算机也快玩完了,因为在向磁盘写入数据时,再慢也不是我们能够感知的,同时还被操作系统查到了,说明你的电脑已经很卡顿了,也就快完了。
T状态
什么时候会出现T状态呢?就是进程想要访问某些硬件,但是硬件不允许,但是操作系统又不想杀死或者回收,就会出现这个状态,我们无法演示,但是可以通过信号来让进程暂停。
T (stopped) 暂停状态



恢复进程


我们kill -9 2472 杀掉进程即可。
t状态
t (tracing stop) 暂停状态
我们通过调试来展现这个状态。





此时我们直接跳到断点处,就是t中断状态。
Z状态(僵尸进程)
Z (zombie) 僵尸状态
进程在结束时会将他的task_struct数据返回给父进程,只有父进程读取了这些数据,这个子进程才会结束,如果不读取,就会处于僵尸状态,成为僵尸进程,不会被操作系统释放他的task_struct如果这样的进程很多,那么就会平白占据很多内存空间。


子进程在运行。
子进程变成僵尸,因为父进程一直没有结束,没有去读取子进程的数据。
我们平时为什么看不到Z状态呢?因为他们的父进程自动就回收了,计算机的速度很快,不要用我们的感受去衡量计算机的速度。
X状态
X (dead) 从Z状态退出就是X状态
这个不解释。
孤儿进程
如果父进程结束,但是子进程没有结束,子进程就会成为孤儿进程,被操作系统接管。



可以看到子进程后面被1号进程接管。我们可以查看一下1号进程,就是操作系统
相关文章:
Linux4.5、进程状态
个人主页:Lei宝啊 愿所有美好如期而遇 目录 进程状态介绍 Linux下具体进程状态 R状态 和 S状态 D状态 T状态 t状态 Z状态 X状态 进程状态介绍 首先,进程状态有运行,阻塞,挂起,这些只是一个大体的概括&am…...
C# Onnx PP-Vehicle 车辆分析(包含:车辆检测,识别车型和车辆颜色)
目录 效果 模型信息 mot_ppyoloe_s_36e_ppvehicle.onnx vehicle_attribute_model.onnx 项目 代码 下载 其他 C# Onnx PP-Vehicle 车辆分析(包含:车辆检测,识别车型和车辆颜色) 效果 模型信息 mot_ppyoloe_s_36e_ppvehi…...
OpenGL之Mesa3D编译for Ubuntu20.04(三十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...
ubuntu22.04 arrch64版操作系统编译zlmediakit
脚本 系统没有cmake,需要通过apt先进行下载,下面的脚本已经包含了 # 安装依赖 gcc-c.x86_64 这个不加的话会有问题 sudo yum -y install gcc gcc-c libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git openssl-devel gcc-c.x86_64 cm…...
Course1-Week1:机器学习简介
Course1-Week1:机器学习简介 文章目录 Course1-Week1:机器学习简介1. 课程简介1.1 课程大纲1.2 Optional Lab的使用 (Jupyter Notebooks)1.3 欢迎参加《机器学习》课程 2. 机器学习简介2.1 机器学习定义2.2 有监督学习2.3 无监督学习 3. 线性回归模型3.1…...
这19个JS代码技巧,后悔没有早点看到
在实际工作中,开发者常面临一些需巧妙编程解决的挑战。有时几行代码就能迎刃而解。本文整理了一系列实用代码片段,助您轻松处理URL、DOM操作、事件处理、日期处理以及用户偏好设置等常见问题。 这些精选代码片段均源自“30 seconds of code”——一个卓…...
Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符
注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 iced的基本逻辑是: UI交互产生消息message,message传递给后台的update,在这个函数中编写逻辑,然后通过…...
ros2文件package.xml与cmakelists.txt比较
每次在ros2里面添加文件以后,都要修改packages.xml,与cmakelists.txt文件。...
vue3使用element plus树形选择器懒加载回显失败问题。
vue3使用element plus树形选择器懒加载回显时树形数据还未加载完成,回显时显示的的绑定值,不是要显示的名称。 解决1:不使用懒加载,一次性将数据返回完成 解决2:编辑回显时,拿到要显示的中文强制修改显示…...
Java基于springoot开发的企业招聘求职网站
演示视频: https://www.bilibili.com/video/BV1xw411n7Tu/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 技术:springootmysqlvuejsbootstrappoi制作word模板 主要功能:求职者可以注册发布简历,选择简…...
数据结构 / 顺序表 / 顺序表概述和结构体定义
1. 顺序表概述 顺序表:线性表的顺序存储称为顺序表逻辑结构:线性结构(一对一)存储结构:顺序存储(使用一段连续的存储空间存储类型相同的数据元素)顺序表:逻辑相邻,物理也相邻顺序表是借助于数组实现,但是不…...
js最新随机字符串,进制数随机字符串,更优秀的随机字符串方式,你绝对没用过的随机字符串方式,可控制位数!
js最新随机字符串,进制数随机字符串,更优秀的随机字符串方式,你绝对没用过的随机字符串方式,可控制位数! 函数封装和传参 首先我们,要封装这样一个函数,首先要确定,传入哪些参数。…...
通过内存标记扩展(MTE)提供增强的安全性
目录 一、内存安全BUG导致的安全漏洞 二、检测和修复内存安全漏洞的难点 三、MTE如何应对这一挑战...
深入理解main方法-Java
深入理解main方法-Java 一、语法说明二、特别说明三、动态传值 一、语法说明 public static void main(String[] args)main方法是虚拟机调用的java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是publicjava虚拟机在执行main()方法时不必创建对象&#x…...
C#开发的OpenRA游戏之属性SelectionDecorations(10)
C#开发的OpenRA游戏之属性SelectionDecorations(10) 前面分析了选择属性,继续分析前面的内容,不过这里不再是选择,而是选择相关的属性。 当用玩家选择地图上一个物品,或者士兵,或者坦克时,就会在周边画上一些指示标记,并且有一个状态条。 通过上图,可以看到建筑物周…...
【机器学习】迁移学习
迁移学习:给定一个有标记的源域和一个无标记的目标域。这两个领域的数据分布不同。迁移学习的目的就是要借助源域的知识,来学习目标域的知识(标签)。或是指基于源域数据和目标域数据、源任务和目标任务之间的相似性,利用在源领域中学习到的知…...
ubuntu 安装 jetbrains-toolbox
ubuntu 安装 jetbrains-toolbox 官网下载 jetbrains-toolbox jetbrains 官网 jetbrains 官网:https://www.jetbrains.com/ jetbrains-toolbox 官网下载页面 在下载页面点击 Download 安装 jetbrains-toolbox 解压 jetbrains-toolbox 安装包 到指定目录 本案例将…...
5.一维数组——输入一行字符,统计其中各个大写字母出现的次数。
文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为一维数组编程题,点滴成长,一起逆袭。 一、题目描述 输入一行字符,统计其中各个大写字母出现的…...
FreeImage 编译安装
FreeImage下载: The FreeImage Project 点击第6行: Download FreeImage 3.18.0 或: wget http://downloads.sourceforge.net/freeimage/FreeImage3170.zip #解压 unzip FreeImage3170.zip -d freeImage 编译FreeImage源代码可能需要遵循…...
编程开发的 词汇
函数命名相关词汇: Strategy 策略 concrete 具体的 Context 上下文 execute 执行 handler 操作者 target 代理对象 proxy 代理 request 请求 iterator 迭代器 handle 方法处理 notify 通知 update 更新 remove 移除,清除 reset 重置 com…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
