【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,一经查实,立即删除!

相关文章

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…

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

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

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

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

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

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

python移动文件

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

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

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的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、全球市场概览 移动支…

vscode怎么点击路径直接跳转对应文件

在vue项目中经常要引入工具类、组件、模版等,想要直接去看对应文件,只能自己找到对应路径再去打开。 我们可用在js项目中创建一个 jsconfig.json文件,TS项目可以创建tsconfig.json 文件代码 {"compilerOptions": {"baseUrl&…

52-QSplitter类QDockWidget类

一 QSplitter类 Qt提供QSplitter(QSplitter)类来进行分裂布局&#xff0c;QSplitter派生于QFrame。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~…

linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除

linux服务器长期使用宝塔自带计划任务&#xff0c;计划任务执行记录占用服务器空间过大&#xff0c;导致服务器根目录爆满&#xff0c;需要长期排查并删除 /www/server/cron 占用空间过大问题处理 /www/server/cron是什么内容&#xff1f;/www/server/cron是否可以删除&#xf…

vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 具体流程&#xff1a; 页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 返回页面后页面没有刷新导致用户名还显示这 项目中没有用keep-alive缓存 也在设置了key 尝试了window.removeEventLi…

vue UI组件整理

Vue2Vue3Element - The worlds most popular Vue UI frameworkOverview 组件总览 | Element Plushttps://v2.iviewui.com/docs/guide/installhttps://www.iviewui.com/view-ui-plus/guide/introduce按钮 Button - Ant Design按钮 Button - Ant DesignVuetify — A Material Des…

考试题库:华为HCIA-Datacom易错题⑪(含答案解析)

华为认证HCIA-Datacom易错题举例和答案分析。 需要更多题库资料&#xff0c;可以在文末领取 1、运行STP协议的设备端口处于Forwarding状态&#xff0c;下列说法正确的有? A.该端口端口既转发用户流量也处理BPDU报文 B.该端口会根据收到的用户流量构建MAC地址表&#xf…

算法每日一题(python,2024.05.24) day.6

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 排序&#xff0b;双指针 先将两个数组进行排序&#xff0c;cursor1和cursor分别指向两个数组的首位&#xff0c;比较两个指针所指的值的大小&#xff0…

swiftUI使用VideoPlayer和AVPlayer播放视频

使用VideoPlayer包播放视频&#xff1a;https://github.com/wxxsw/VideoPlayer 提供一些可供测试的视频链接&#xff0c;不保证稳定可用哦&#xff1a; https://vfx.mtime.cn/Video/2019/06/15/mp4/190615103827358781.mp4https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp…

B端UI设计,演绎高情逸态之妙

B端UI设计&#xff0c;演绎高情逸态之妙

Unity 实现让物体渲染在最前面

演示 实现方案 1.创建一个shader脚本 2.删掉原来的内容&#xff1a;我们自己写 附上完整的shader代码&#xff1a; Shader "Custom/ZTestAlways" {Properties {_Color ("Color Tint",Color) (1,1,1,1)_MainTex("Main Tex",2D) "white&q…