当前位置: 首页 > news >正文

Linux进程——Linux下常见的进程状态

前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。


在这里插入图片描述


本篇主要内容:

  • 操作系统中的进程状态
  • Linux下的进程状态

在这里插入图片描述


在开始之前,我们先来简单了解以下进程状态

在这里插入图片描述
进程的本质就是PCB中的一个变量!!!

所谓状态变化,本质就是修改整形变量!!!


进程状态

  • 1. 操作系统中的进程状态
    • 运行状态
    • 阻塞状态
    • 挂起状态
  • 2. Linux下的进程状态
    • 运行状态
    • 休眠状态
    • 前台进程和后台进程
    • 停止状态
  • 3. 总结

1. 操作系统中的进程状态

本篇围绕操作系统中的三种进程状态:运行状态阻塞状态挂起状态来展开

在这里插入图片描述
当进程准备好了随时可以被调度时,其实就是创建状态和就绪状态,这俩没有太大区别!!


运行状态

虽然不同的计算机有不同的配置,但是无论如何
每个CPU都会在系统层面有属于自己的运行队列!

在这里插入图片描述
只要在运行队列中的进程都是运行状态!


阻塞状态

我们在编写的代码中,都会无法避免的访问一些操作系统里的某些资源,比如:磁盘,键盘,网卡等硬件设备,当我们用scanf或者cin读取键盘数据时,当我们不输入s时,数据没有准备就绪,进程不具备访问条件,进程代码无法向后执行,这就是阻塞状态

系统会等待用户输入,只要不输入,要访问的资源就没有就绪

比如:

  1 #include<stdio.h>2 3 int main()4 {5     int n = 0;6 7     printf("please Enter# ");8 9     scanf("%d",&n);10 11     printf("echo# %d\n",n);12 13     return 0;14 }  

我们在运行这段代码时;
在这里插入图片描述
进程一直等待着我们从键盘输入数据,此时进程就处于阻塞状态!

操作系统要管理进程,操作系统就必须知道进程的基本信息;操作系统要管理硬件,也就必须知道硬件的相关信息!

那操作系统是如何知道底层硬件的信息呢?

在操作系统中,有管理设备的结构体
在这里插入图片描述
将一个进程从运行队列移动至的等待队列中,再将状态改为阻塞那么这个进程就处于阻塞状态,这个过程就是状态变化!

进程状态的变化:

  • 更改PCB status的整数变量
  • 将PCB连入不同的队列中

所有过程都只会进程的PCB有关,和进程代码数据没有关系!

操作系统中,会存在非常多的队列,运行队列,等待硬件的设备等待队列等,并且所有系统内的进程都是以双链表链接起来!


挂起状态

假设:
一个进程当前被阻塞了,那么这个进程在它所等待的资源没有就绪的时候,该进程是无法被调度的。如果此时恰好OS内的内存资源已经严重不足了,那么操作系统该怎么办?

  • 因为此时进程处于阻塞状态,并且内存已严重不足,所以OS会将PCB对应的数据和代码转移到磁盘,为内存释放一部分资源,腾出一部分空间,然后该进程就被挂起了

在这里插入图片描述

  • 将内存数据进行置换到外设,针对所有阻塞进程,因此不用担心效率降低的问题,因为这个是必然的,而现在首要任务是让操作系统能继续执行下去!
  • 分区是磁盘中真实存在的,它的大小往往是很小的,这个部分专门
    用于内存严重不足时和内存进行交互,并且当内存情况缓解后,曾经被置换出去的代码和数据又会重新加载进来
  • 当进程被系统调度时,曾经被置换出去的进程代码和数据,又要重新被加载进来

2. Linux下的进程状态

下面是一段库中找的状态的定义:

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 */
};

Linux下的进程状态:

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

运行状态

在介绍完这些状态之后,我们来实际操作看看!

我们来一段死循环代码,方便我们观察

  1 #include<stdio.h>  2 #include <unistd.h> 3 int main()  4 {  5     while(1)6     {7         printf("hello , Linux!\n");8         sleep(1);                                                                                                                                                                      9     }                                                                                                       10     return 0;                                                                                               11 }                                                                                                                                                                                     
~      

在这里插入图片描述

我们可以看到程序时处于一个S+的状态,但是依据概念,程序不应该是R状态吗?

  • 因为循环打印时,IO输出是很慢的打印字符会和外设屏幕交互,因此大部分时间进程都处于阻塞状态,但也有极少时间在打印,所以查看进程状态时,我们偶尔可以看见R状态

如果我们将printf删除,单留while,会是什么情况呢?

  1 #include<stdio.h>  2   3 int main()  4 {  5     while(1)  6     {  7     }                                                                                  8     return 0;      9 } 

在这里插入图片描述
我们可以看到此时程序处于R状态


休眠状态

  • S(sleeping):休眠状态,浅度睡眠,可以被终止,浅度睡眠会对外部信号做出响应
  • D(disk sleep):也是休眠状态,深度睡眠

S相对操作系统来讲也就是阻塞状态,D则是专门针对磁盘设计的

我们来换个角度来理解以下D状态:

  • 假设在内存中,有一个进程,需要将自己的代码和数据写入磁盘,因为内容数据不小,在磁盘拷贝时,需要一段时间,此时进程变为S状态。
  • 此时,恰好系统内的内存资源已经严重不足了,系统压力太大,Linux在是在没办法时候,会通过杀掉进程,节省资源的,来不及进程反应直接被系统 “干掉” 。
  • 然后磁盘写入失败,而磁盘也有自己的事情要做,然后将未完成的代码和数据直接删除,拷贝失败!

如果真是这样,下次是很重要的数据,那么损失不可估量

因此系统创造了D状态:磁盘休眠状态;D状态不可被杀掉,OS也没有权力!

综上:S状态可以被终止,D状态不可被终止!


前台进程和后台进程

刚刚在上面查看进程状态时,是否有过疑问,为什么进程状态后面会有一个加号呢?

其实加号表示的是前台进程,而没有加号则是后台进程

我们先来了解一下这两种进程:

  • 前台进程:运行时无法使用bash外壳的指令并且可以被ctrl + c 强制终止
  • 后台进程:运行时可输入指令,不能被ctrl + c 终止只能使用kill指令来杀掉进程。

程序默认是前台进程,那么我们怎样才能将前台进程变成后台进程?
在执行程序时在末尾加上 &

通过视频我们来更直观的了解二者的区别

后台进程与前台进程


停止状态

  • T (stopped) 在进程访问软件资源的时候可能暂时不让进程进行访问,就将进程设置为STOP
  • t (tracing stop) debug程序的时候,追踪程序,遇到断点,进程暂停了

下面我们来看两个视频理解以下:

kill指令停止进程

SIGSTOP与SIGCONT

调试遇到断点

查看t状态

二者都是停止状态,对于停止状态用到的不多,我们了解一下即可!


3. 总结

在了解Linux中进程的分类时,我们通常是先了解操作系统的进程,因为二者有一定的联系,了解操作系统能更好理解进程在操作系统中的运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!

谢谢大家支持本篇到这里就结束了
在这里插入图片描述

相关文章:

Linux进程——Linux下常见的进程状态

前言&#xff1a;在进程学习这一块&#xff0c;我们主要学习的就是PCB这个进程控制块&#xff0c;而PBC就是用来描述进程的结构体&#xff0c;而进程状态就是PCB结构体中的一个变量。 本篇主要内容&#xff1a; 操作系统中的进程状态Linux下的进程状态 在开始之前&#xff0c;我…...

TCP长连接短链接

1、短连接 短连接是指通讯双方有数据交互时&#xff0c;就建立一个连接&#xff0c;数据发送完成后&#xff0c;则断开此连接&#xff0c;即每次连接只完成一项业务的发送。 2、长连接 长连接是指在一个连接上可以连续发送多个数据包&#xff0c;在连接保持期间&#xff0c;…...

代码随想录35期Day33-Java

Day33题目 LeetCode1005:K 次取反后最大化的数组和 核心思想&#xff1a;每次取反都取反最小的。如果有负数&#xff0c;则一直取反最小的负数&#xff0c;如果没有就取反正数。取反次数只需要看是奇数还是偶数。偶数则正数序列不变&#xff0c;奇数则最小的变成负数 class …...

PMP考试没过怎么办?如何补考?(附复核流程)

最近刷小红书&#xff0c;看很多人都在晒PMP通过的成绩截图&#xff0c;一方面为大家开心&#xff0c;终于拿到了期盼已久的PMP&#xff0c;但同时也有宝子发挥失常没通过考试&#xff0c;所以这期针对没考过的宝子们&#xff0c;出一期复盘文章&#xff0c;无论结果如何&#…...

自主实现Telnet流量抓取

自主实现Telnet流量抓取 根据测试需求&#xff0c;需要抓取Telnet流量包&#xff0c;使用wireshark Python&#xff08;socket、telnetlib库&#xff09;实现 实现代码 主要此处有坑&#xff0c; 根据协议规则&#xff0c;wireshark 默认端口为23 的是Telnet协议&#xff0…...

以瓦片地图为底图添加图表,保留拖拽功能

1、问题1 在地图上覆盖一个容器层&#xff0c;容器层上的内容显示不出来如何解决&#xff1f; 原因&#xff1a;堆叠指数问题 解决方案&#xff1a;绝对定位后&#xff0c;提升其z-index值即可 2、问题2 在地图上覆盖一个容器层&#xff0c;影响了地图拖拽&#xff0c;如何…...

Windows cmd bat之特殊符号及变量

cmd 常用变量 bat批处理常用命令 %1~%9表示拖入文件&#xff08;%0以外的输入文件&#xff09;,%0表示批处理文件本身 %0~%1字母意思基本相同&#xff0c;不区分大小写 ::打印当前窗口地址 echo “%cd%” %0 获取当前文件路径 %~d0 …...

用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)

首先直接上结果吧&#xff0c;MicroSIP 助手&#xff0c;控制MicroSIP自动拨号&#xff0c;定时呼叫的非常实用小工具&#xff01; 在使用MicroSIP 助手之前&#xff0c;我们需要了解MicroSIP是什么&#xff0c;MicroSIP是一个SIP拨号软件&#xff0c;支持注册任意SIP平台实现拨…...

axios 取消token 模糊搜索

import axios from ‘axios’; // 创建一个取消令牌源&#xff08;cancel token source&#xff09; const CancelToken axios.CancelToken; const source CancelToken.source(); // 下拉框搜索函数 function search() { // 获取输入值 const inputValue document.getElem…...

【OTS4WORD】“精简并行过程”——容易剪裁的“软件过程改进方法和规范”模板

附件资源是作者针对SPP采用模板重新格式化打包制作&#xff0c;原模板具有格式不受控的缺点&#xff0c;导致文档编制过程中引起不必要的排版麻烦。 附件资源适用于希望改进工作流程&#xff0c;适配CMMI质量管理体系的公司或个人使用&#xff0c;质量改进管理组织、项目管理组…...

22 | MySQL有哪些“饮鸩止渴”提高性能的方法?

短连接风暴 第一种方法:先处理掉那些占着连接但是不工作的线程。 kil id 第二种方法:减少连接过程的消耗。 让数据库跳过权限验证阶段,重启数据库,并使用–skip-grant-tables 参数启动。 慢查询性能问题 索引没有设计好 创建索引都支持 Online DDL 了,对于那种高峰期数…...

【AIGC调研系列】VILA-1.5版本的视频理解功能如何

VILA-1.5版本的视频理解功能表现出色&#xff0c;具有显著的突破。这一版本不仅增强了视频理解能力&#xff0c;还提供了四种不同规模的模型供用户选择&#xff0c;以适应不同的应用需求和计算资源限制[1][2][3]。此外&#xff0c;VILA-1.5支持在笔记本等边缘设备上部署&#x…...

如何解决WordPress邮件发送和接收问题

在使用WordPress网站时&#xff0c;用户有时可能会遇到邮件接收或发送失败的问题。这种问题不仅影响网站的正常运营&#xff0c;还可能影响用户体验。以下是一篇详细的解决方案文章&#xff0c;帮助您系统地诊断和解决WordPress不发送或收不到邮件的问题。 引言 WordPress作为…...

MySQL学习笔记10——日志

日志 一、日志1、通用查询日志&#xff08;1&#xff09;开启通用查询日志&#xff08;2&#xff09;查看通用查询日志&#xff08;3&#xff09;删除通用查询日志 2、慢查询日志3、错误日志4、二进制日志&#xff08;1&#xff09;查看二进制日志&#xff08;2&#xff09;刷新…...

OpenSPG docker 安装教程

文章目录 前言自述 一、OpenSPG1.介绍 二、安装步骤1.安装服务端2.客户端部署 前言 自述 我最近是想结合chatglm3-6b和知识图谱做一个垂直领域的技术规范的问答系统&#xff0c;过程中也遇到了很多困难&#xff0c;在模型微调上&#xff0c;在数据集收集整理上&#xff0c;在知…...

TypeScript学习日志-第十六天(泛型)

泛型 一、函数泛型 当我们有多个函数是一样的不同的的函数的类型不一样时&#xff0c;我们可以使用泛型&#xff0c;这样就可以省去很多重复的书写&#xff0c;例如&#xff1a; 这样的两个函数时一样的&#xff0c;就是类型不一样&#xff0c;我们就可以使用泛型这样写&…...

Flutter路由跳转的两种方式

1.基本路由跳转&#xff1a;文件引入在你要跳转的页面引入 ElevatedButton(onPressed: () {Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return const NewsPage(arguments: {"title": "基本路由新闻页面传值","a…...

Hydroxyethyl-PEG-Hydroxyethyl,Hy-PEG-Hy是一种由聚乙二醇(PEG)和二酰肼单元构成的嵌段共聚物

【试剂详情】 英文名称 Hydroxyethyl-PEG-Hydroxyethyl&#xff0c;Hy-PEG-Hy 中文名称 聚乙二醇二酰肼&#xff0c;酰肼 PEG 酰肼 外观性状 由分子量决定&#xff0c;固体或者液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.4k&#xf…...

链表面试题目:反转一个单链表的两种方法(解析+代码)

我们继续来看一下单链表的题目和代码吧&#xff0c;把学习的知识运用到实际中&#xff0c;大家加油 先看OJ题目 OJ题目&#xff08;反转单链表&#xff09; 双指针法 1.创建两个指针&#xff0c;为pre curr&#xff0c;curr指向头结点&#xff0c;curr用来遍历链表 2.curr指向…...

[C++][数据结构]AVL树插入的模拟实现

前言 紧接着上一篇文章&#xff0c;我们来模拟实现一下set的底层结构 引入 对于BSTree&#xff0c;虽然可以缩短查找的效率&#xff0c;但如果数据有序它将退化为单支树 我们可以用AVL树来解决这个问题。 概念 AVL树&#xff1a; 它的每个结点的左右子树高度之差的绝对值…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...