【Linux】进程(2):进程状态

大家好,我是苏貝,本篇博客带大家了解Linux进程(1),如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • (A)R/S/D/T/t状态
    • 1. R:程序运行的状态
    • 2. S:休眠状态
    • 3. T/t:暂停进程
    • 4. D(disk sleep):不可被kill杀,深度睡眠,不可中断睡眠
  • (B)僵尸进程(Z)
  • (C)孤儿进程

其实进程状态只是PCB的一个属性,即是Linux下task_struct结构体的一个属性
在这里插入图片描述

所以如果进程状态被修改了,即task_struct结构体里的status属性被修改了

下图是进程的7种状态
在这里插入图片描述

(A)R/S/D/T/t状态

进程一共有7种状态,下面我们来一一介绍

1. R:程序运行的状态

先来写makefile文件,将上面的makefile文件复制过来,内容如下:
在这里插入图片描述

这时我决定将新的.c文件命名为testStatus.c,可执行文件命名为testStatus,为了方便,我们可以在尾行模式下执行下面代码,一键将myprocess替换成testStatus
在这里插入图片描述

不过这只对单纯的myprocess替换,若后面带了.c或其它后缀,可能不能替换

在这里插入图片描述

写出下面代码
在这里插入图片描述

编译.c文件,运行进程,通过每秒显示的进程信息中我们发现,进程处于S+状态,而非R状态(运行状态),这是为什么?
在这里插入图片描述

将.c文件修改一下,去掉打印
在这里插入图片描述

再来看看进程的状态,发现这时又是R状态,这又是什么原因呢?
在这里插入图片描述

第一种情况:
需要打印,所以要与外设显示器打交道。CPU将处理的结果传到内存中,再从内存传到显示器文件里。在此期间,CPU处理得到1个结果可能只需要几纳秒,而显示器打印可能需要几毫秒,所以在第二次得到CPU处理的结果时,进程要等待显示器响应。在我们循环打印时,进程在绝大多数情况下都要等待显示器响应,所以进程显示S状态。

第二种情况:
不需要打印,所以不需要和外设打交道,因此进程不需要等待响应,所以进程处于R状态

2. S:休眠状态

处于S状态有两种可能:
一是进程在等待资源就绪(上面的第一种情况),二是可中断睡眠

可中断睡眠:处于睡眠状态,但是随时可以被外部因素(如CTRL+C)打断

展示一下:修改.c文件
在这里插入图片描述

运行进程2秒后CTRL+C可以结束进程

在这里插入图片描述

我们发现,S状态后面还跟着一个+,这是什么意思?
S+:表示进程在前台运行
S:表示进程在后台运行

用下面命令就能用代码让进程在后台运行
在这里插入图片描述

后台运行的进程不能被CTRL+C结束,需要用kill -9 pid结束
在这里插入图片描述

3. T/t:暂停进程

暂停的进程会等待被唤醒。如何暂停进程呢?也要用kill命令

先来查看所有的kill信号
在这里插入图片描述

我们上面的kill -9 pid就是使用了9号信号:SIGKILL,作用是杀掉进程。现在来学习19号和18号信号:SIGSTOP和SIGCONT,作用分别是暂停进程和唤醒进程

先修改.c文件
在这里插入图片描述

用了kill -19 pid后,进程状态确实变成了T(暂停状态)
在这里插入图片描述

我们继续让暂停的进程被唤醒,用kill -18 pid

在这里插入图片描述

注意:一个进程在被暂停和被唤醒后,会自动变成后台运行(状态后面没有+)

其实我们在学习进程状态之前就有用过暂停进程,比如:调试

调试时,遇到断点就会暂停进程

在调试前,注意要在gcc后面加-g,这样形成的才是可被调试的debug模式,否则默认是不可被调试的release模式
在这里插入图片描述

进入调试,在第10行打断点,运行进程。到断点位置,进程暂停,T状态。gdb里执行c(continue)继续进程,S状态。再到断点位置,进程暂停,T状态
在这里插入图片描述

4. D(disk sleep):不可被kill杀,深度睡眠,不可中断睡眠

D状态是Linux系统比较特有的一种状态,不可被kill杀,只能等待进程自己醒来。如果想杀掉进程,只能重启,甚至于断电

(B)僵尸进程(Z)

在Linux中,进程=内核数据结构task_struct+进程的代码和数据。一个已经运行完毕的进程,代码和数据都不再使用,所以它们的空间会被释放。但进程要维持自己的退出信息,退出信息位于内核数据结构task_struct中,未来让父进程进行读取。如果没有父进程读取,该进程虽然已经运行完毕但task_struct会一直存在,即僵尸进程,task_struct占的空间非常大,这就导致内存泄漏。

先修改.c文件
在这里插入图片描述

上面代码是说,子进程循环3次就结束进程,父进程一直存在但不会读取子进程的退出信息
在这里插入图片描述

我们可以看到,在子进程结束后,并没有退出,而是以僵尸进程的形式存在。
在这里插入图片描述

我们同样发现,处于Z状态时进程名会发生改变,且后面带有,这也是在告诉我们该进程是僵尸进程
在这里插入图片描述

在后面我们还会学习让父进程读取子进程的退出信息的函数waitpid(),读取的瞬间子进程变成X状态,再由操作系统释放

我们以前启动的所有的进程,为什么没有关心过僵尸进程呢?也就是为什么我们没有关心内存泄漏问题?因为直接在命令行中启动的进程,它的父进程是bash,bash会自动读取新进程的退出信息,然后由操作系统释放

(C)孤儿进程

父进程如果先退出,子进程就会变成孤儿进程。为了保证子进程被正常回收,孤儿进程一般都会被1号进程(可以理解为操作系统)领养。

修改.c文件

在这里插入图片描述

父进程退出后,子进程(pid=7966)就变成孤儿进程,此时的父进程为1号进程
在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

在Spring Boot中集成H2数据库:完整指南

引言 Spring Boot是一个简化企业级Java应用程序开发的强大框架。H2数据库是一个轻量级的、开源的SQL数据库,非常适合用于开发和测试。本文将指导您如何在Spring Boot应用程序中集成H2数据库,并探索一些高级配置选项。 依赖关系 首先,我们需…

windows打开工程文件是顺序读写吗

在 Windows 操作系统中,打开和读写工程文件的过程可以是顺序读写,也可以是随机读写,具体取决于使用的软件和文件的性质。以下是一些详细解释: 顺序读写 顺序读写(sequential access)是指按文件中数据的顺…

C/C++覆盖率收集

linux下C/C++代码覆盖度检查工具:BullseyeCoverage 主要作用: a.识别在测试过程中没有完全执行的代码; b.获取测试完整性相关的一些度量,来帮助判断是否已经充分测试。 BullseyeCoverage 使用步骤一般是: 1)安装BullseyeCoverage

ThreadLocal详解,与 HashMap 对比

ThreadLocal原理,使用注意事项,解决哈希冲突方式->和HashMap对比 ThreadLocal 原理: ThreadLocal 是 Java 中的一个线程级别的变量,它允许您在不同线程之间存储和访问相同变量的不同副本,每个线程都拥有自己的副本&…

单片机的自动化编程语言:深度探索与未来展望

单片机的自动化编程语言:深度探索与未来展望 单片机作为现代电子设备的核心控制单元,其自动化编程语言的发展与应用,对提升设备性能、简化编程流程具有重大意义。本文将从四个方面、五个方面、六个方面和七个方面,对单片机的自动…

Day-04python模块

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典,使用字典的方法操作数据 。 或者将…

社交媒体数据恢复:最右

第一步:确认数据丢失原因 请确定您是因为误删、设备损坏还是其他原因导致“最右”中的数据丢失。这将有助于您更好地了解需要采取的恢复措施。 第二步:尝试从备份中恢复数据 如果您有定期备份的习惯,请尝试从备份中恢复丢失的数据。备份文…

Springboot JVM监控 通过Promethus

Springboot内置了对Prometheus得支持,可以监测得点有: JVM各指标参数(GC,堆,非堆等)接口调用次数,延时系统内存,IO,CPU使用率 部署Prometheus和Grafana 准备一台2核4G…

局域网测速工具详解

使用好局域网测速工具可以帮助我们: 1. 网络性能评估 - 确定带宽:测量网络的实际上传和下载速度,以确定是否满足业务需求。 - 检测延迟和抖动:评估网络传输中的延迟和抖动,确保实时应用(如VoIP、视频会议&a…

问题排查|记录一次基于mymuduo库开发的服务器错误排查(段错误--Segmentation fault (core dumped))

问题记录: 在刚完成mymuduo库之后,写了一个简单的测试服务器, 但是在服务器运行后直接报错: cherryhcss-ecs-4995:~/mymuduo/example$ ./testserver Segmentation fault (core dumped)出现多错误这通常意味着程序试图访问其内存空…

解决Mybatisplus中没有Db类静态工具的方案--提高版本

方案&#xff1a;将两个的版本都提高即可解决 Mybatis—plus的依赖文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version></dependency><!-- ge…

Linux module参数传递

一、Linux Module参数传递 在C 语言中&#xff0c;可以在main函数利用argc、argv获取用户的输入&#xff0c;Linux驱动同样可以传递参数&#xff0c;下面简要介绍参数宏的使用方法 利用下面宏定义的参数可以在下面路径找到 /sys/module/xxxxx/parameters/ 1、module_param() …

STM32自己从零开始实操03:输出部分原理图

一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器&#xff0c;设计出以小电流撬动大电流的继电器电路。 &#xff08;提示&#xff09;电路需要包含&#xff1a;三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…

手写HTML字符串解析成对应的 AST语法树

先看效果 展示如下&#xff1a; HTML模版 转成ast语法树后 在学习之前&#xff0c;我们需要了解这么一个问题&#xff0c;为什么要将HTML字符串解析成对应的 AST语法树。 为什么&#xff1f; 语法分析&#xff1a;HTML字符串是一种标记语言&#xff0c;其中包含了大量的标签…

使用PNP管控制MCU是否需要复位

这两台用到一款芯片带电池&#xff0c;希望电池还有电芯片在工作的时候插入电源不要给芯片复位&#xff0c;当电池没电&#xff0c;芯片不在工作的时候&#xff0c;插入电源给芯片复位所以使用一个PNP三极管&#xff0c;通过芯片IO控制是否打开复位&#xff0c;当芯片正常工作的…

python移动文件

测试1(直接把B文件夹移动到了A里&#xff0c;成为了A的子文件夹) import os import shutil# 移动文件夹,B文件夹在当前目录没有了&#xff0c;跑到了A的子文件里 ## shutil.move(./example1/B/, ./example1/A/)测试2(B文件不动&#xff0c;将B文件里的所有的子文件夹移动到A内…

响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

Android高通 12/13 录屏流程代码位置

需求如下图 实现系统录屏功能 frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord 涉及代码 ScreenRecordDialog # startBtn RecordingService # startRecording# stopRecording ScreenMediaRecorder # start # end #save 1、点击开始录屏framewo…

金融科技发展报告:移动支付的市场格局与趋势

引言 随着科技的飞速发展,金融科技已成为推动全球经济发展的重要力量。移动支付作为金融科技的重要分支,其市场格局与趋势日益受到业界的关注。本文将深入剖析移动支付的市场格局,探讨其发展趋势,并辅以相关案例作为辅助。 一、移动支付市场格局 1、全球市场概览 移动支…

python-pytorch编写transformer模型实现翻译0.5.00-写模型

前言 在网上看了一篇文章,借用了文章的大部分代码,并对代码的预测进行修改使得可以正确的预测了,具体链接找了半天找不到 代码 import numpy as np # 导入 numpy 库 import torch # 导入 torch 库 import torch.nn as nn # 导入 torch.nn 库 d_k = 64 # K(=Q) 维度 d_v =…