初识进程状态

🌎进程状态【上】


文章目录:

进程状态

    发现进程的状态

    运行队列

    进程排队

    进程状态的表述
      状态在代码中的表示
      运行状态
      阻塞状态
      挂起状态

    总结


前言:

  为了搞明白正在运行的进程是什么意思,我们有必要了解进程的不同状态,那么话不多说,开始我们今天的话题!

在这里插入图片描述


🚀发现进程的状态

  我们按照上次所说的创建子进程,分别执行不同的工作:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 #include<sys/types.h>5 6 int main()7 {8     printf("before fork!\n");9     sleep(3);10     printf("start fork!\n");11     sleep(1);12 13     pid_t id = fork();14     if(id < 0)15     {16         perror("fork error!\n");17         exit(0);18     }19 20     if(id == 0)//子进程21     {22         int cnt = 6;23         while(cnt)24         {25             printf("I'm child process, pid=%d\n", getpid());26             sleep(1);27             cnt--;                                                                                                                                                                                                                                                                                                                                                                        28         }29         exit(0);30     }31 	//父进程32     sleep(1);33     int cnt = 5;34     while(cnt)35     {36         printf("I'm father process, pid=%d\n", getpid());37         sleep(1);38         cnt--;39     }40 41     return 0;42 }
~

  这里使用了 exit() 函数,我们以前可能在C语言里见到过它,只知道它可以退出程序。其实在Linux当中exit函数是 退出进程 接口:

在这里插入图片描述

  它的作用是终止一个进程,而函数参数是 退出码(这个以后会谈),表示 退出状态

  那我们把程序运行起来之后,再使用监控脚本进行监控:

在这里插入图片描述
  观察我们从监控脚本得出的结果,我们发现带有 STAT 的一栏里除了最后一项我标红的位置为 “Z” 外,其他的状态都是 “S+” 状态,并且在标红的这一行,的最后,出现了 <defunct> 的字样。

  这个就是我们今天要说的——进程状态


🚀运行队列

  进程的状态,一定是与CPU如何执行有关的,所以在了解进程状态之前,有必要先了解CPU如何执行进程。

  我们说过,程序运行起来时就是一个进程,进程需要被CPU给执行,并且进程是以 循环队列 的形式被CPU执行,但是进程在CPU上并不是一直在执行的。

在这里插入图片描述

  每一个进程都有自己的 时间片 ,也就是 每个进程运行最大时间超过这个时间如果程序还没有被执行完毕,则强制退出,执行下一个进程,这个进程则重新排队等待CPU资源。

  当然,有些情况下进程也许是在等待某些硬件资源,所以并不会一直执行,比如:

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

在这里插入图片描述
  这个时候,程序此时就在等待我们硬件资源,也就是键盘的写入。

  我们知道,进程 = task_struct + 可执行程序 ,那我们进程在排队的时候是 task_struct 在排队,还是可执行程序在排队,亦或是两者都排队呢?我们不妨讲个故事:

  有一天,阿熊自信满满,觉得自己实力已经可以去闯闯了,于是阿熊连夜写了一份简历,第二天就向自己心仪的公司投递了过去,每天期待着答复。
  这天,面试官手里拿着10份简历,按照面试官对应聘者的评价依次排放,筛选出自一半交给了hr,很幸运,阿熊居然没被刷下来,hr按照这个顺序依次比较,最后hr看着阿熊的简历坦然一笑…[未完]

  其实,阿熊可以看为进程的代码和数据,而简历可以看作进程的PCB,而阿熊的简历被hr拿到的简历在一起的时候,其实就是进程排队的过程。

  所以我们可以得出 结论进程排队不是进程的可执行程序在排队,而是进程的PCB在排队!

  于是就在当天晚上,阿熊收到了一封短信:“尊敬的阿熊,介于您出色的表现,已经进入我司人才库…” 然而就在阿熊一个人偷抹眼泪的时候,某个面试官正在骂骂咧咧投递自己的简历到另一家公司…[结束]


🚀进程排队

  那么如何理解进程排队这件事情,进程排队本质上就是数据结构的双向链表,但是稍稍不同的是,这个指针指向的并不是下一个PCB的开始,而是PCB内部的一个指针。

在这里插入图片描述
  那么如何通过PCB的中间链表去访问链表以上的属性信息呢?其实很简单:

struct task_struct
{char ch1;char ch2;char ch3;
}

  假如我们要从 ch3 访问 ch1,只需要ch3 - 2,也就是根据ch3到ch1的 偏移量 来确定ch1的位置,同样,在PCB的内部也是根据偏移量来确定位置的

  那么在我们Linux内核中是如何确定偏移量的呢?

在这里插入图片描述

  话说回来,进程排队的意义是什么?我们应该已经清楚了:只要是在排队,就一定是在等待某种资源!


🚀进程状态的表述

✈️状态在代码中的表示

  我们都知道,Linux是使用C语言写的,而如何描述进程状态,其实就是使用 来表示对应的状态,比如:

#define NEW 0
#define READY 1
#defien RUNNING 2 
#define BLOCK 3
//...struct task_struct
{int status;//就是上面定义的宏//...
}

  现在,我们能把各个状态都具象化成宏了,而这些 状态决定了进程的后续动作,Linux中可能同时运行多个进程,OS就要根据进程的状态来决定下一步做什么。

在这里插入图片描述
  以上可能是某个教材的进程状态图,我们接下来介绍的就是,运行、阻塞、和挂起 状态。


✈️运行状态

  进程有一个状态叫做 运行状态,很多人以为只有当CPU执行到当前进程时,才能称为当前进程为运行状态,实则不然。

  每一个CPU其实都有一个运行队列,比如:

struct runqueue{//运行队列int count;task_struct *p;//指向进程
}

在这里插入图片描述
  此时,整个队列的进程运行状态都为运行状态,而运行状态的意思是:

  R(Running): 准备好被CPU随时调度。


✈️阻塞状态

  进程有时会处于一种特殊的状态,阻塞状态 我们前面scanf等待硬件资源就会把进程拉入到一个 阻塞队列(Blocked Queue) 当中,表示正在阻塞等待某种硬件资源,当获得硬件资源后就会从阻塞队列中退出,链入到运行队列当中。

  操作系统对下管理硬件资源,那么操作系统是如何管理这些硬件资源的?还是那六个字:先描述,再组织!

  将硬件资源描述为一个个属性,将这些属性组织起来称为结构体,那么从此以后,操作系统对硬件的管理就变为了对这个结构体对象的管理

struct device//硬件设备
{size_t type;//硬件类型,键盘、鼠标、磁盘,网卡等...//设备的操作方法//状态struct listnode node;task_struct *p;//指向进程//...
}

在这里插入图片描述
  所以我们能得出的结论是:

  当我们的进程在等待 软硬件资源 的时候,资源如果没有就绪,我们的进程PCB就只能: 1.将自己设置为阻塞状态。2.将自己的PCB链入等待资源的等待队列 (通常是资源竞争)


✈️挂起状态

  进程还存在一种挂起状态,这种状态与计算机内存有关系,当 计算机内存非常吃紧的时候,操作系统为了 保证向上提供良好的运行环境,所以操作系统一定会把需要等待资源的进程进行特殊处理,将内存资源释放一些,以便于 向上提供良好的环境

  比如说阻塞队列和等待队列,这些需要等待软硬件资源的进程,此时,这些进程不用我们的资源但是还占用我们的资源,所以OS就会将这些进程的代码和数据 唤入 到磁盘中的 swap分区

在这里插入图片描述
  其实这种挂起状态为 阻塞挂起,当然不排除有些教材里有其他挂起,但是我们就谈这一种。

  唤出 仅仅是将进程的 代码和数据 唤出,进程的 task_struct 一定要保留在内存中,不然OS就没法确定这个进程的状态了。

  可能在有些书里还有其他挂起,但是挂起的原因只有一个:一定是因为某种资源的紧缺才会挂起。


📒✏️总结

  •   每个进程都有自己的进程状态,在C语言中以 的方式体现,有了状态操作系统就知道下一步要做什么
  •   进程中存在许多队列,CPU执行的队列叫做 运行队列,阻塞等待软硬件资源的叫做 阻塞队列 和 等待队列
  •   进程排队是进程的 task_struct 在排队,而不是可执行程序在排队。并且只要是排队,就 一定是在等待某种资源分配
  •   挂起状态跟 内存有关,当内存状态吃紧时,将需要等待软硬件资源的进程的代码和数据唤出到 硬盘的 swap分区,需要时再唤出。

在这里插入图片描述

  创作不易,如果这篇文章对您有帮助的话,还望留下一个小小的三连呀~~

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

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

相关文章

“批量记录,轻松修改:让收支明细管理更高效!“

在繁忙的现代生活中&#xff0c;管理个人收支明细成为了我们理财的重要一环。晨曦记账本&#xff0c;作为一款功能强大的记账工具&#xff0c;致力于帮助用户轻松记录和管理每一笔收支&#xff0c;让财务更加清晰、有序。 第一步&#xff0c;首先我们要记进入晨曦记账本主页面…

TSN工业交换机在煤矿行业的革命性应用

随着信息化时代的到来&#xff0c;煤矿行业也迎来了前所未有的机遇与挑战。在这个充满活力和竞争的领域&#xff0c;技术的革新对于提高生产效率、保障安全生产至关重要。而随着时间敏感网络&#xff08;TSN&#xff09;技术的不断发展&#xff0c;TSN工业交换机作为其关键组成…

第二证券|股票开户有什么条件?炒股新手一定要看!

股票买卖尽管投资风险是很高的&#xff0c;可是由于其报答性也高&#xff0c;仍是有许多投资者乐意去测验&#xff0c;这也带动了许多新手买卖。那么股票开户有什么条件&#xff1f;下面就由第二证券为大家剖析&#xff1a; 股票开户有什么条件&#xff1f; 1、年龄要求 处理…

二分查找的理解及应用场景。

一、是什么 在计算机科学中&#xff0c;二分查找算法&#xff0c;也称折半搜索算法&#xff0c;是一种在有序数组中查找某一特定元素的搜索算法 想要应用二分查找法&#xff0c;则这一堆数应有如下特性&#xff1a; 存储在数组中有序排序 搜索过程从数组的中间元素开始&…

(黑马出品_高级篇_02)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_02&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——分布式事务 今日目标1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2…

WMS系统批次管理全面解析

一、WMS系统批次管理的基本概念 WMS系统的批次管理&#xff0c;是指对仓库中不同批次的产品进行精细化、规范化的管理&#xff0c;确保产品的可追溯性、可控制性和安全性。批次管理涉及到产品的入库、存储、出库等各个环节&#xff0c;通过对批次的精确控制&#xff0c;实现仓…

RK3568行业定制主板脉冲群抗扰度整改方案验证

1. 试验目的及原理 电快速瞬变脉冲群EFT试验的目的是验证电子设备机械开关对电感性负载切换、继电器触点弹跳、高压开关切换等引起的瞬时扰动的抗干扰能力。这种试验方法是一种耦合到电源线路、控制线路、信号线路上的由许多快速瞬变脉冲组成的脉冲群试验。容易出现问题的场合有…

微信小程序开发:上传网络图片到阿里云oss

上文遇到的问题&#xff0c;用户上传的人像图片在经过人像增强后返回的结果需要再次上传到阿里云的oss。 因为是需要下下载&#xff0c;再上传&#xff0c;这个域名我们没有在MP后台配置download域名&#xff0c;所以报错了&#xff1a; 但是MP后台只能配置https的域名&#xf…

常见面试题之计算机网络

1. OSI 五层模型&#xff08;或七层模型&#xff09;是什么&#xff0c;每一层的作用是什么 应用层&#xff1a;又可细分为应用层、表示层、会话层。其中应用层主要做的工作就是为应用程序提供服务&#xff0c;常见的协议为 HTTP、HTTPS、DNS等&#xff1b;表示层主要做的工作…

如何只用pycharm创建venv虚拟环境

如何只用pycharm创建venv虚拟环境 网上貌似没有好的博客讲解&#xff0c;我之前也一直在这环境搭建上疑惑。不过照着我这博客来&#xff0c;应该没问题了。 前言 如图所示&#xff0c;我新建了一个空白文件夹。 接下来点击终端&#xff08;AltF12&#xff09; 如果发现开头…

使用Thymeleaf-没有js的html模板导出为pdf

html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"><head><title>PDF Template</title> </head> <body> <h1>User Information</h1> <p>Name: <span th:text"${user.name}&…

【BI-Dataease】dataease设计思路

参考&#xff1a;https://juejin.cn/post/7089310768671227940 1、BI可视化工具的关键问题是什么&#xff1f; &#xff08;1&#xff09;各种数据源的数据结构和类型如何统一&#xff1f; &#xff08;2&#xff09;各种图表的配置属性不一致&#xff0c;属性如何绑定到数据…

【python】linux系统安装了多个版本的python,如何查看安装路径、第三方库路径

【python】linux系统安装了多个版本的python&#xff0c;如何查看安装路径、第三方库路劲。 1. 查看安装路径、第三方库路径 进入对应版本的python路径&#xff0c;进入交互界面&#xff0c;输入 import sys sys.path 2. 查看第三方库中已安装库

STM32进阶笔记——FATFS文件系统(下)

本专栏争取每周三更新直到更新完成&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 本文需要一些SD卡和内存管理等前置知识&#xff0c;后续文章会介绍&#xff0c;这里先介绍一下FATFS文件系统。关于FATFS的文章分为上下两篇&#xff0c;上篇主要介绍什么是FAT…

二分搜索树和AVL树

问题 跑道预订系统。一个飞机场只有一个飞机跑道&#xff0c;需要为未来的飞机着陆预留空闲的跑道。飞机预订的着陆时间为t&#xff0c;假如没有其他的计划在(t-k,tk)的时间内着陆的飞机&#xff0c;则将t加入集合R。其中k是变量。请问有没有一种时间复杂度为O(logn)的算法解决…

增强PLMs可塑性!MetaAI | 提出主动遗忘机制,加快模型收敛,准确率高出21.2%!

引言 在自然语言处理领域&#xff0c;预训练语言模型&#xff08;PLMs&#xff09;扮演着至关重要的角色&#xff0c;它可以根据任务需求&#xff0c;可迁移至各种下游任务中。然而&#xff0c;PLMs在适应新语言时面临挑战&#xff0c;尤其是在数据和计算资源受限的情况下。本…

数据结构与算法----复习Part 14 (树与二叉树)

本系列是算法通关手册LeeCode的学习笔记 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 目录 一&#xff0c;树&#xff08;Tree&#xff09; 树的相关术语 节点间关系 树的其他术语 二&#xff0c;二叉…

比较JavaScript中的for...in和for...of循环

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

linux解析域名指令 nslookup 或者 host

host www.baidu.com 第二种方法 nslookup www.baidu.com 注意&#xff1a;ns是name server之意

【包邮送书】Elasticsearch 通过索引阻塞实现数据保护深入解析

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…