【Linux】进程学习(二):进程状态

目录

  • 1.进程状态
    • 1.1 阻塞
    • 1.2 挂起
  • 2. 进程状态
    • 2.1 运行状态-R
      • 进一步理解运行状态
    • 2.2 睡眠状态-S
    • 2.3 休眠状态-D
    • 2.4 暂停状态-T
    • 2.5 僵尸状态-Z
      • 僵尸进程的危害
    • 2.6 死亡状态-X
    • 2.7 孤儿进程

1.进程状态

1.1 阻塞

阻塞进程因为等待某种条件就绪,而导致的一种不推进的状态
通俗来说,阻塞就是进程卡住了,因为缺少了某种资源

所以阻塞一定是在等待某种资源

为什么阻塞

因为进程要通过等待的方式,等具体的资源被别人用完之后,再被自己使用。

简单理解进程等待和资源

  • 资源比如磁盘、网卡、显卡 等各种外设
  • 例如,当我们下载游戏时,下载速度0kb,此时CPU无法继续正常的下载,需要等待网络资源,CPU就将这个进程设置为阻塞状态,此时进程就在等待。

具体理解进程等待

系统为了管理各种各样的进程,需要为进程先描述创建task_struct,然后再组织形成双链表形式的数据结构,同样,系统为了管理各种各样的硬件资源(磁盘、网卡、显卡 等各种外设),就需要为他们创建struct来对硬件资源进行描述,然后再组织形成数据结构
例如为了管理网卡操作系统创建了struct dev,其中包含了struct task_struct* queue的等待队列,当一个进程等待网卡资源时,cpu无法调度这个进程,这个进程就被维护在网卡struct dev结构体中的queue等待队列中。
例如当scanf等待用户输入时,该进程就是阻塞状态,这个进程被维护在键盘struct dev结构体中的queue等待队列中。

实际操作系统的实现要复杂的多,这只是一个基本的理解过程。

总的来说:
阻塞就是进程不被调度,一定是当前进程需要等待某种资源就绪,一定是进程的 task_struct 结构体需要在某种被 OS 管理的资源下排队

1.2 挂起

挂起:当 CPU 资源紧张时,将 进程的代码和数据交换至磁盘中挂起,此时内存中只有 PCB
挂起可以看作一种特殊的阻塞状态,因此挂起的全称是阻塞挂起

2. 进程状态

进程和程序不相同,进程是活动的且有状态变化的。一个进程是有多个状态的。

这里我们具体谈一下Linux操作系统中的进程状态,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 */

task_struct是一个结构体,内部会包含各种属性,其中就有状态

struct task_struct
{
int status;

}

在这里插入图片描述

2.1 运行状态-R

进程是R状态,不代表正在运行,代表可被调度。换句话说,进程只有是R状态才可被调度,其他状态要先转为R状态,才能被OS调度。

这表明处在运行状态的进程要么是在被OS调度中,要么在运行队列里。
当操作系统需要切换进程运行时,就直接在运行队列中选取进程运行

进一步理解运行状态

当我们运行下面这个简单的死循环,我们再来查看当前进程的状态

#include<stdio.h>
#include<unistd.h>

int main()
{

  while(1)
  {
    printf("Hello\n");
    
  }

  return 0;
}

我们发现该进程并不是处在运行状态上,他的状态是S+(睡眠状态)( + 表示当前进程在前台运行中),并不是在运行状态,这和我们的认知相矛盾。

在这里插入图片描述

原因在于:

  • 代码中存在printf,这个函数需要去访问外设资源。
  • 我们知道,CPU的速度非常快,外设的速度非常慢。
  • 当printf想要访问屏幕外设来打印时,这个外设并不一定准备就绪,因此进程就在这个外设的等待队列中等待。
  • 外设准备就绪,进程被CPU调度,打印工作几乎一瞬间就运行完成,因此这个状态R很难被查询到。绝大多数的时间进程都在外设等待队列中排队,所以我们就查到S睡眠状态。

2.2 睡眠状态-S

睡眠 S 的本质就是 进程阻塞,表示此时进程因等待某种资源而暂停运行。
睡眠 S也称作可中断睡眠我们可以强制将其关闭。

  • ctrl + c 关闭
    注意:处在后台运行(也就是不带+号的)的进程无法使用ctrl + c来关闭。
    在这里插入图片描述
  • kill命令关闭
    kill -9 pid

在这里插入图片描述

2.3 休眠状态-D

当一个进程处于休眠状态(disk sleep)时,表示该进程不会被杀掉,即便是kill命令和操作系统也不行只有该进程自动唤醒才可以恢复。
休眠也称为 不可中断睡眠

2.4 暂停状态-T

我们可以让进程处于暂停状态

通过kill -l命令来查看信号
在这里插入图片描述
我们可以使用19.SIGSTOP和18.SIGCONT来使进程暂停和恢复

  • kill -19 PID 暂停进程
  • kill -18 PID 恢复进程

暂停进程

在这里插入图片描述
恢复进程

在这里插入图片描述

注意:在 gdb 中调试代码时,打断点实际上就是使进程在指定行暂停运行,此时进程处于追踪暂停状态 t

2.5 僵尸状态-Z

Linux当进程退出时,一般进程不会立即退出,而是会维持一个状态------僵尸状态Z
目的是为了方便后续父进程或是OS读取子进程的退出结果

创建一个父子进程,并运行。
在这里插入图片描述
终止子进程,就可以看到子进程的状态变成了僵尸进程
在这里插入图片描述

僵尸状态是必要的,进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。 而任务完成的结果,可以用退出码来体现。

#include<stdio.h>
#include<unistd.h>

int main()
{

  while(1)
  {
    printf("Hello\n");
    sleep(1);
  }


  return 0;
}

这个返回值0返回给了操作系统,告诉他任务顺利完成。
在Linux操作系统,我们可以使用**echo $?**命令获取最近一次进程退出时的退出码。

echo $?

僵尸进程的危害

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护不能释放。
如果不能对僵尸进程进行回收,就会造成内存泄漏的问题。

2.6 死亡状态-X

这个状态只是一个返回状态,我们不会在任务列表里看到这个状态。因为当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了。

2.7 孤儿进程

当创建一个父子进程,如果退出子进程,此时子进程就成了僵尸进程。当先退出了父进程时,此时的子进程就被称为孤儿进程

在这里插入图片描述
当退出父进程后,父进程无法通过ps指令查询出来,说明此时的父进程已经被回收了。此外子进程的PPID变成了1,也就是操作系统。

  • 父进程的父进程是bash,有回收机制,因此无法看到僵尸进程。
  • 当终止父进程时,此时的子进程会被OS领养
    • 被领养后,后续子进程退出,就能被回收了。这也就是OS领养的原因

以上就是我们对“进程状态”这一主题的全面探讨。通过此次学习,我们初步掌握了进程的不同状态,理解了何为阻塞状态及其产生的原因。同时,我们也深入了解了进程状态转换的各种情况,为今后更深入地学习和控制进程状态奠定了坚实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

备战蓝桥杯---搜索(完结篇)

再看一道不完全是搜索的题&#xff1a; 解法1&#xff1a;贪心并查集&#xff1a; 把冲突事件从大到小排&#xff0c;判断是否两个在同一集合&#xff0c;在的话就返回&#xff0c;不在的话就合并。 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace …

飞书上传图片

飞书上传图片 1. 概述1.1 访问凭证2. 上传图片获取image_key1. 概述 飞书开发文档上传图片: https://open.feishu.cn/document/server-docs/im-v1/image/create 上传图片接口,支持上传 JPEG、PNG、WEBP、GIF、TIFF、BMP、ICO格式图片。 在请求头上需要获取token(访问凭证) …

Lua: 一门轻量级、高效的脚本语言

Lua: 一门轻量级、高效的脚本语言 在当今软件开发的领域中&#xff0c;寻找一门既灵活又高效的脚本语言&#xff0c;一直是开发者们追求的目标。Lua作为一门小巧、高效、可嵌入的脚本语言&#xff0c;已经成为了众多开发者的首选之一。无论是游戏开发、嵌入式系统、Web 开发还是…

左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1] 输出: 0提示: …

Office2013下载安装教程,保姆级教程,附安装包和工具

前言 Microsoft Office是由Microsoft(微软)公司开发的一套基于 Windows 操作系统的办公软件套装。常用组件有 Word、Excel、PowerPoint、Access、Outlook等。 准备工作 1、Win7 及以上系统 2、提前准备好 Office 2013 安装包 安装步骤 1.鼠标右击【Office2013(64bit)】压缩…

Mac使用AccessClient打开Linux堡垒机跳转闪退问题解决

登录公司的服务器需要使用到堡垒机&#xff0c;但是mac使用AccessClient登录会出现问题 最基础的AccessClient配置 AccessClient启动需要设置目录权限&#xff0c;可以直接设置为 权限 777 chmod 777 /Applications/AccessClient.app注: 如果不是这个路径,可以打开终端,将访达中…

HiveSQL——不及格课程数大于2的学生的平均成绩及其排名

注&#xff1a;参考文章&#xff1a; SQL 不及格课程数大于2的学生的平均成绩及其排名-HQL面试题47【拼多多】_sql 不及格人数超过两人-CSDN博客文章浏览阅读976次。0 问题描述create table scores( sid int, score int, cid int);insert into scores values(1, 90, 1),(1, 59…

Visio2013 下载安装教程,保姆级教程,附安装包和工具

前言 Visio是负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂信息、系统和流程进行可视化处理、分析和交流&#xff0c;可以促进对系统和流程的了解&#xff0c;深入了解复杂信息并利用这些知识做出更好的业务决策。帮助您创建具有专业外观的图表&#xff0c…

通过Demo学WPF—数据绑定(二)

准备 今天学习的Demo是Data Binding中的Linq&#xff1a; 创建一个空白解决方案&#xff0c;然后添加现有项目&#xff0c;选择Linq&#xff0c;解决方案如下所示&#xff1a; 查看这个Demo的效果&#xff1a; 开始学习这个Demo xaml部分 查看MainWindow.xaml&#xff1a; …

新型Black Matter勒索病毒,勒索300万美金

前言 BlackMatter勒索病毒是一款基于RAAS模式的新型勒索病毒&#xff0c;该勒索病毒组织成立于2021年7月&#xff0c;该勒索病毒黑客组织对外宣称&#xff0c;已经整合了DarkSide、REvil和LockBit等勒索病毒的最佳功能特点。 勒索病毒黑客组织曾表示不会对医疗保健、关键基础设…

【记录】记一次关于前端单元测试的全英文问卷调查( Survey: Automatically Generated Test Suites for JavaScript)

文章目录 OPENING STATEMENTBackgroundTask background: Fix the failing test casesBefore the task: Task: Fix the failing test casesTask: Executable DocumentationBefore the task: Bonus Opportunity: One more taskTask: Test Cases ClusteringRewardThank You! 原地址…

使用深度学习对视频进行分类

目录 加载预训练卷积网络 加载数据 将帧转换为特征向量 准备训练数据 创建 LSTM 网络 指定训练选项 训练 LSTM 网络 组合视频分类网络 使用新数据进行分类 辅助函数 此示例说明如何通过将预训练图像分类模型和 LSTM 网络相结合来创建视频分类网络。 要为视频…

TS学习与实践

文章目录 学习资料TypeScript 介绍TypeScript 是什么&#xff1f;TypeScript 增加了什么&#xff1f;TypeScript 开发环境搭建 基本类型编译选项类声明属性属性修饰符getter 与 setter方法static 静态方法实例方法 构造函数继承 与 super抽象类接口interface 定义接口implement…

[office] 教你如何用Excel制作施工管理日记 #其他#媒体

教你如何用Excel制作施工管理日记 对于在工地实习或者其他施工人员来说&#xff0c;常常会需要记录施工管理日记&#xff0c;其他软件的用法可以过于复杂&#xff0c;下面小编就来教你如何用Excel制作施工管理日记 对于在工地实习或者其他施工人员来说&#xff0c;常常会需要记…

软件文档测试

1 文档测试的范围 软件产品由可运行的程序、数据和文档组成。文档是软件的一个重要组成部分。 在软件的整人生命周期中&#xff0c;会用到许多文档&#xff0c;在各个阶段中以文档作为前阶段工作成果的体现和后阶段工作的依据。 软件文档的分类结构图如下图所示&#xff1a; …

【并发编程】享元模式

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 享元模式 简介 定义 英文名称&#xff1a;Flyweight pattern. 当需要重用数量有限的同一类对象时 享元模式是一种结构型的设计模式。它的主要目…

吉他学习:右手拨弦方法,右手拨弦训练 左手按弦方法

第六课 右手拨弦方法https://m.lizhiweike.com/lecture2/29362775 第七课 右手拨弦训练https://m.lizhiweike.com/lecture2/29362708

【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)

【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底层实现(2.版本区别dictEntry & redisObject详解)-CSDN博客 紧接着前两篇的总体介绍&#xff0c;从这篇开始&#x…

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

dddddddddddddddddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…