实操(进程状态,R/S/D/T/t/X/Z)Linux

1 R 状态并不直接代表进程在运行,而是该进程在运行队列中进行排队,由操作系统在内存维护的队列

#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("我在运行吗\n");sleep(1);}return 0;
}

 查看状态(ps ajx | grep mytest | grep -v grep)

  • 这里printf本质是向外设打印消息,你在频繁打印时,外设可能没就绪,当前进程不在cpu排队,只在外设中排队,等设备就绪了,才把数据写到外设中
  • S状态是阻塞状态的一种,以休眠的状态进行阻塞,并没有一直在cpu运行队列中,是因为printf而导致等待某中资源
#include <stdio.h>
#include <unistd.h>int main()
{while(1){//printf("我在运行吗\n");//sleep(1);}return 0;
}

 查看状态(ps ajx | grep mytest | grep -v grep)

  • 注释掉就变成R了,代码中没有任何访问资源的代码,whike循环判断就是一种计算,当前的代码就是纯计算代码,在进程调度的生命周期里,只会用cpu资源,只要被调度一定是R状态
  • 本质就是因为cpu太快了,访问外设,操作系统频繁的将进程从外设队列拿到cpu运行队列,或者cpu运行队列拿到外设队列

 2  S 休眠状态,可中断休眠,本质就是一种阻塞状态

#include <stdio.h>
#include <unistd.h>int main()
{while(1){int a = 0;scanf("%d", &a);printf("%d", a);}return 0;
}

 查看状态(ps ajx | grep mytest | grep -v grep)

  • scanf在等你从键盘里输入,进程没有被调度,它当前所等的资源没有就绪,它不会在运行队列中等,而是在键盘中等,等键盘有数据了,在把当前进程pcb放到运行队列里调度,读取数据;它在等键盘资源,这种状态就叫做阻塞,换句话说就是卡住了,如果不想等了,ctrl+c可以中断此进程

3 D 休眠状态,不可中断休眠

场景:进程想往磁盘中写入100MB的数据


进程:“磁盘你出来,我现在有数据要交给你,帮我存一下”
磁盘:“你想存多少数据存到哪里?”
进程:“磁盘的角落,我需要把数据保存一下,我一定要写完数据之后CPU才让我去跑”
磁盘:“我这个外设太慢了,所以写100 MB要等等我哦”
这个进程把自己设置成阻塞状态S,自己就在磁盘的内核数据结构当中进行排队,cpu就先执行其他人的代码了,在磁盘进行拷贝的时候,操作系统路过,他作为一个内存的管理者,发现现在内存资源特别紧张
操作系统:“你这个进程在干什么呢?怎么什么都不干在这里等?你没看系统忙成什么样子了,内存已经严重不足了,我要把你杀掉”(如果你的系统资源严重不足,操作系统会干掉一些不怎么正常工作的进程)
干掉的同时磁盘在写数据,写的时候发现好像不行了,因为磁盘空间不足了,反正就是因为一些原因,我写失败了,这个时候他就去找进程
磁盘:“你这个数据写入失败了”
他突然发现人不见了,这个时候就只剩磁盘拿着100 MB的数据在风中流浪,磁盘想着把这个数据丢了,但是万一这个数据是银行的转账信息呢,保留吧又不知道保存在哪,保存在我的位置,可是对应的进程又不知道我存在什么地方,下次你找我要的时候我忘了怎么办;反正磁盘就是个办事的,让它存哪就存了,但是现在进程没了,这份数据万一被搞丢了,到底是这三个人(操作系统、进程、磁盘),其中哪一个人的锅呢?

问题的根就在于谁叫你操作系统能杀掉进程呢?源码的设计者突然发现,我们只要保证这个进程不能被杀死不就行了吗?所以我们就有了一种状态,休眠状态D;在linux当中如果一个进程属于D状态,该进程无法被杀死,即便是操作系统,也无法杀死D状态进程,如果这个进程刀枪不入,刚刚的问题就不会产生了,只有当这个D状态,自己醒来才可以杀掉它,其实还有另一个办法就是关机重启,但有时候如果有D状态,可能都无法正常关机,只要你查到了D状态,基本上你这个机器已经快宕机了,这个时候只能是拔电源,此时数据丢失的损失就需要你自己承担了,不过99%的情况不会出现D状态,哪怕出现一个,当前的系统也已经快要挂了,因为这个D状态应该一瞬间就完成,主要原因是当前你的磁盘已经非常卡了,压力很大,来不及给你进行数据写入,再有两三个D状态,再来一些I/O,机器就直接挂掉了,出现宕机;这个D状态如果做应用开发不用关心,一般是做运维的要关心

 4 T 暂停状态

  • 比如说有一个进程,操作系统不允许你往显示器上打印消息,但这个用户就是往显示器上打印消息,此时为了拦截这个进程的非法行为,操作系统可能把这个进程暂停;休眠和暂停有什么区别,休眠通常是等待某种资源,是真正的阻塞状态,而是操作系统是在不杀掉这个进程的情况下,停止这个进程的某些行为,比如你想访问网卡操作系统,发现不能让你访问,但这个用户想要访问网卡代码,操作系统就有可能暂停他了,就是你访问一些你没有权利访问的资源操作系统,有时候不想杀掉进程,他就会把你暂停
#include <stdio.h>
#include <unistd.h>int main()
{int count = 0;while(1){printf("我在运行吗?%d\n", count++);sleep(1);}return 0;
}

 查看状态(ps ajx | grep mytest | grep -v grep) 

  暂停进程(kill -19),查看状态(ps ajx | grep mytest | grep -v grep)

让进程继续(kill -18), 查看状态(ps ajx | grep mytest | grep -v grep) 

现在有两个现象,ctrl+c终止不了进程,S+状态变成了S,查进程的时候状态,如果带了+号,证明该进程是在前台运行的,前台运行可以ctrl+c终止它,但如果没有+号,意味着这个进程是在后台运行的,你可以继续执行你的shell指令,但它在后台还会继续执行自己的代码,可以用9号信号干掉它,(kill -9)

5 追踪式的暂停

  • 关于暂停有一种场景,大家是可以理解的,在调试的时候你不打断点,你直接运行进程就跑完了,但如果你打了个断点,你发现当你而运行,他会在断点处停下来断点处停下来的本质就是让进程暂停这就是为什么有时候执行的bug的时候调试某些代码的时候,我调到一部分想让他暂停遇到断点,他会停下来,让我去查看他的上下文,就是把这个进程暂停了,我们证明一下

makefile(第2行加一个 -g)

  1 mytest:test.c2     gcc -o $@ $^ -g                                                                3 .PHONY:clean4 clean:5     rm -f mytest

开始调试(gdb ./mytest)

查看状态(ps ajx | grep mytest | grep -v grep) 

  •  查到的t是被追踪状态,我启动的mytest进程,r的时候开始跑,遇到断点处就停下来了,表示追踪式的暂停,也是暂停的一种,为什么我们在打断点他就停下来了,根本原因是gdb遇到断点处,它会向你的进程发送暂停信号让你停下来

 6 X && Z

我们为什么创建进程?因为我们要让进程帮我们办事,有时候我们会关心结果,有时候不关心结果,当我们想关心结果的时候,我们可以查看进程退出码, 比如我们的预期结果是100,返回1表示代码有问题,结果不对

#include <stdio.h>
#include <unistd.h>int main()
{int x = 10;if (x == 100) return 0;else return 1;
}

查看退出码(echo $?)

X 死亡状态,发生在一瞬间,几乎查不到,如果一个进程退出了,立马X状态,立马退出,退出之后进程的所有历史痕迹,全部被操作系统杀掉,你作为父进程有没有机会拿到退出结果呢?在Linux中,当进程退出的时候,一般进程不会立即彻底退出,而是要维持一个状态Z,叫做僵尸状态,方便后续父进程或者是操作系统读取该子进程退出的退出结果

比如有一天你去一个地方跑步,跑着跑着,突然看到前面有一个人倒在地板上一动不动,这个时候你拨打了110、120,就在旁边等着救护人员的到来,警察来之后,第一件事情是封锁现场,让法医先确认这个人的死因是什么,确认这个人是自然死亡的,警察就会通知家属,让他们去处理,拉到火葬场等等,刚刚这个场景,人倒在地上没有被立即销毁,当警察检查这个人的状态时,这个人的状态就叫做僵尸状态,为什么要让他处于僵尸状态?方便别人来甄别他退出的原因是什么,所以进程要维持短暂的僵尸状态,关于如何处理,我们下一篇再来谈回收,今天重点谈状态

如何让我们看到僵尸的状态呢?子进程退出,但是不要回收子进程(目前还没了解到),换句话说,只要我们写出来一个父子进程,先让子进程退出,父进程先不退,子进程一退所处的状态就是僵尸状态

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{pid_t ret = fork();if (ret == 0){//子进程while(1){printf("我是子进程,pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);}}else{//父进程while(1){printf("我是父进程,pid:%d,ppid:%d\n", getpid(), getppid());sleep(1);}}return 0;
}

运行显示 (./mytest)

 查看状态(ps ajx | grep mytest | grep -v grep) 

 杀掉子进程(kill -9 [PID]),查看状态(ps ajx | grep mytest | grep -v grep)

 

虽然我们还没谈到回收,我们可以先来了解,如果不回收会造成什么问题呢?如果我们不释放操作系统,它就要维持这个进程的状态、相关的数据结构,也就是pcb,如果不释放,它曾经申请占用的资源就会一直被占用,创建进程就是申请内存 申请了内存但是长时间不归还,导致系统能用的资源越来越少,这叫做内存泄露问题,一旦我们回收了进程,就会从Z状态瞬间变成X状态,进而操作系统才会真正释放进程的所有资源,如何回收我们下一个篇章再进行谈论

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

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

相关文章

React 文件上传新玩法:Aliyun OSS 加持的智能上传组件

文件上传是前端开发中的“老朋友”&#xff0c;但如何让它既简单又强大&#xff0c;还能无缝对接云端存储&#xff1f;今天&#xff0c;我要带你认识一个超酷的 React 组件 AliUploader&#xff0c;它不仅支持拖拽上传、批量编辑和文件排序&#xff0c;还直接把文件传到 Aliyun…

LabVIEW多线程

在 LabVIEW 中&#xff0c;多线程编程是提升程序执行效率的关键手段&#xff0c;尤其是在需要并行处理数据采集、控制执行和用户界面交互的场景下。LabVIEW 本身是基于数据流&#xff08;Dataflow&#xff09;的编程语言&#xff0c;天然支持多线程&#xff0c;但要高效利用多线…

图解AUTOSAR_SWS_LINStateManager

AUTOSAR LIN状态管理器(LinSM)详细设计 文档摘要 本文档提供了AUTOSAR LIN状态管理器(LinSM)模块的详细设计解析,包括架构、状态机、睡眠唤醒流程以及配置结构。通过图形化方式展现LinSM在AUTOSAR通信栈中的作用及其与其他模块的交互关系。 目录 AUTOSAR LIN状态管理器(Lin…

python+form+opengl显示动态图形数据

说明&#xff1a; pythonformopengl显示动态图形数据 我希望做一款动态opengl图形数据 1.用python脚本&#xff0c;输入指定参数 2.生成一组数据&#xff0c; 3.将数据保持成本地文件 4.在c#中调用此文件&#xff0c;解析 5.将数据用opengl展示 效果图: step1:添加依赖 C:\U…

Android Gradle、Android Gradle Plugin、BuildTool关系

1. Gradle 的定位&#xff1a;通用构建工具 Gradle 是一个通用的跨平台构建工具&#xff0c;支持多种语言&#xff08;如 Java、Kotlin、C&#xff09;和项目类型 它的核心功能包括&#xff1a; ​任务自动化&#xff1a;通过 Groovy/Kotlin DSL 脚本定义编译、测试、打包等…

DHCP之报文格式

字段说明&#xff1a; op (op code): 表示报文的类型&#xff0c;取值为 1 或 2&#xff0c;含义如下 1:客户端请求报 2:服务器响应报文 Secs (seconds):由客户端填充&#xff0c;表示从客户端开始获得 IP 地址或 IP 地址续借后所使用了的秒数&#xff0c;缺省值为 3600s。 F…

观察者模式在Java微服务间的使用

一.、使用RabbitMQ来实现 (1) 生产者&#xff08;订单微服务&#xff09; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service;Service public class OrderService {private final RabbitTemplate rabbitTemplate;…

OSPF五种数据包详解

一、OSPF头部封装 OSPF是跨四层封装协议&#xff0c;直接封装在网络层之上&#xff0c;需要IP协议使用一个协议号来标定——89。 OSPF头部结构&#xff1a; 版本&#xff1a;标识OSPF的版本&#xff0c;OSPFv2&#xff08;2&#xff09;、OSPFv3&#xff08;3&#xff09;&am…

NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)

贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当&#xff0c;难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法&#xff1f; 贪⼼算法&#xff0c;或者说是贪⼼策略&#xff1a;企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步&#xff1b;解决每⼀步时…

Linux(十二)信号

今天我们就要来一起学习信号啦&#xff01;&#xff01;&#xff01;还记得小编在之前的文章中说过的ctrlc吗&#xff1f;之前小编没有详细介绍过&#xff0c;现在我们就要来学习啦&#xff01;&#xff01;&#xff01; 一、信号的基本介绍 首先&#xff0c;小编带领大家先一…

Dify开发实战-自制插件 和安装python3最新版本 记录版本 后续会持续更新

自定义插件 Dify 插件脚手架工具Python 环境&#xff0c;版本号 ≥ 3.12 安装Python 一 进入官网 https://www.python.org/downloads/windows/ 点击下载 二、安装python&#xff08;本文中有借鉴其他图片 所以图片展示python版本可能不一致 请忽略&#xff09; 1.双击打开py…

Docker安装、配置Redis

1.如果没有docker-compose.yml文件的话&#xff0c;先创建docker-compose.yml 配置文件一般长这个样子 version: 3services:redis:image: redis:latestcontainer_name: redisports:- "6379:6379"command: redis-server --requirepass "123456"restart: a…

Parasoft C++Test软件单元测试_操作指南

系列文章目录 Parasoft C++Test软件静态分析:操作指南(编码规范、质量度量)、常见问题及处理 Parasoft C++Test软件单元测试:操作指南、实例讲解、常见问题及处理 Parasoft C++Test软件集成测试:操作指南、实例讲解、常见问题及处理 进阶扩展:自动生成静态分析文档、自动…

二级索引详解

二级索引详解 二级索引(Secondary Index)是数据库系统中除主键索引外的附加索引结构,用于加速基于非主键列的查询操作。以下是关于二级索引的全面解析: 一、核心概念 特性主键索引 (Primary Index)二级索引 (Secondary Index)唯一性必须唯一可以唯一或非唯一数量每表只有…

Python_level1_字符串_11

目录 一、基本概念 二、字符串基本操作&#xff1a;【索引、切片、遍历】 1.字符串与列表&#xff08;相同&#xff09; 1&#xff09;索引&#xff08;从0开始&#xff09;(可以获取某一个/某几个连续的字符) 2&#xff09;切片 [xx:xx] 与 列表 语法规则一样 [起…

Axure数据可视化科技感大屏设计资料——赋能多领域,展示无限价值

可视化大屏如何高效、直观地展示数据&#xff0c;并将其转化为有价值的决策依据&#xff0c;成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板&#xff0c;作为一款强大的数据展示工具&#xff0c;正在以其出色的交互性和可定制性&#xff0c;赋能多个领域&#xff0c…

MySQL 性能调优:数据库的极限运动训练

就像运动员需要不断训练才能突破极限&#xff0c;数据库也需要各种调优才能跑得更快…让我们一起给 MySQL 安排一套专业的"健身计划"&#xff01; 什么是 MySQL 性能调优&#xff1f;&#x1f914; MySQL 性能调优是指通过各种配置优化、结构调整和查询改进&#x…

4.5/Q1,GBD数据库最新文章解读

文章题目&#xff1a;Emerging trends and cross-country health inequalities in congenital birth defects: insights from the GBD 2021 study DOI&#xff1a;10.1186/s12939-025-02412-7 中文标题&#xff1a;先天性出生缺陷的新趋势和跨国健康不平等&#xff1a;GBD 202…

基于DeepSeek、ChatGPT支持下的地质灾害风险评估、易发性分析、信息化建库及灾后重建

前言&#xff1a; 地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下&#xff0c;地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害&#xff0c;还…

Linux | 安装超级终端串口软件连接i.MX6ULL开发板(8)

01 它的安装步骤也非常简单,安装语言选择中文简体,点击确定,如下图所示。 点击下一步,如下图所示。 02