初识进程状态

news2024/12/23 13:29:50

🌎进程状态【上】


文章目录:

进程状态

    发现进程的状态

    运行队列

    进程排队

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

    总结


前言:

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

在这里插入图片描述


🚀发现进程的状态

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

  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.coloradmin.cn/o/1512805.html

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

相关文章

优思学院|为什么企业要做质量管理体系认证?

在二战后的美国&#xff0c;公司对自己的产品质量颇为自满。市场需求旺盛&#xff0c;产品销售状况良好&#xff0c;即便产品存在质量缺陷&#xff0c;消费者似乎也能接受。这种态度导致了一种现象&#xff1a;即使在生产结束时发现了一定比例的缺陷&#xff0c;公司也能通过加…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Span)

作为Text组件的子组件&#xff0c;用于显示行内文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 10开始支持继承父组件Text的属性&#xff0c;即如果子组件未设置…

解决 mmseg/models/decode_heads/mask2former_head.py 中__init__()关键字参数错误

目录 【1 - 问题描述】 【2 - 报错位置检查】 【3 - 问题解决】 【4 - 解决的过程】 【1 - 问题描述】 在mmsegmentation中运行mask2former模型的分割任务遇到报错缺少关键字的错误&#xff1a; TypeError: class Mask2FormerHead in mmseg/models/decode_heads/mask2form…

【gpt实践】同时让chatgpt和claude开发俄罗斯方块

最近chatgpt和claude都在使用&#xff0c;其实大部分日常使用场景表现都没有相差太多&#xff0c;想搞一个有趣的小实验&#xff0c;如果同时让chatgpt和claude开发俄罗斯方块谁会表现的更好呢&#xff0c;说干就干&#xff01; prompt 我选择了用英文描述&#xff0c;毕竟英…

大模型应用开发-大模型数据侧总结

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

使用 Amazon Bedrock 和 RAG 构建 Text2SQL 行业数据查询助手

背景 随着企业数据量的持续增长&#xff0c;如何让非技术人员也能轻松分析数据、获得商业洞察成为了当前的痛点。本文将介绍如何使用亚马逊云科技的大语言模型服务 Amazon Bedrock 以及 RAG (Retrieval Augmented Generation)&#xff0c;实现 Text2SQL 功能&#xff0c;以此为…

【深度学习笔记】5_12稠密连接网络(DenseNet)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.12 稠密连接网络&#xff08;DenseNet&#xff09; ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

【论文速读】| DeepGo:预测式定向灰盒模糊测试

本次分享论文为&#xff1a;DeepGo: Predictive Directed Greybox Fuzzing 基本信息 原文作者&#xff1a;Peihong Lin, Pengfei Wang, Xu Zhou, Wei Xie, Gen Zhang, Kai Lu 作者单位&#xff1a;国防科技大学计算机学院 关键词&#xff1a;Directed Greybox Fuzzing, Path…

Postman请求API接口测试步骤和说明

Postman请求API接口测试步骤 本文测试的接口是国内数智客&#xff08;www.shuzike.com&#xff09;的API接口手机三要素验证&#xff0c;验证个人的姓名&#xff0c;身份证号码&#xff0c;手机号码是否一致。 1、设置接口的Headers参数。 Content-Type&#xff1a;applicati…

2024蓝桥杯每日一题(区间合并)

一、第一题&#xff1a;挤牛奶 解题思路&#xff1a;区间合并 区间合并模板题 【Python程序代码】 n int(input()) a [] for i in range(n):l,r map(int,input().split())a.append([l,r]) def cmp(x):return x[0],x[1] a.sort(keycmp) res1,res20,0 st,ed a[0][0…

JS-12-关键字this、apply()、call()

一、对象的方法 在一个对象中绑定函数&#xff0c;称为这个对象的方法。 示例&#xff1a; 1、对象&#xff1a; var xiaoming {name: 小明,birth: 1990 }; 2、给xiaoming绑定一个函数。比如&#xff0c;写个age()方法&#xff0c;返回xiaoming的年龄&#xff1a; var x…

亲测抖音小程序备案流程,抖音小程序如何备案,抖音小程序备案所需准备资料

抖音小程序为什么要备案&#xff0c;抖音官方给出如下说明&#xff1a; 1、2024年3月15日后提交备案的小程序将不保证2024年3月31日前平台可初审通过&#xff1b; 2、2024年3月31日后未完成备案小程序将被下架处理。 一&#xff0c;备案前需准备资料 &#xff08;一&#xff0…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColor…

k8s+wordpress+zabbix+elastic+filebeat+kibana服务搭建以及测试

一&#xff0c;环境&#xff1a;docker&#xff0c;k8s&#xff0c;zabbix&#xff0c;以及搭建worpdress&#xff0c;elasticsearch&#xff0c;filebeat&#xff0c;kibana 二&#xff0c;主机分配&#xff1a; 名称host详述个人博客3192.168.142.133 搭配mysql8.0.36的数据…

Stable Diffusion 模型:从噪声中生成逼真图像

你好&#xff0c;我是郭震 简介 Stable Diffusion 模型是一种生成式模型&#xff0c;可以从噪声中生成逼真的图像。它由 Google AI 研究人员于 2022 年提出&#xff0c;并迅速成为图像生成领域的热门模型。 数学基础 Stable Diffusion模型基于一种称为扩散概率模型(Diffusion P…

【QT】文件流操作(QTextStream/QDataStream)

文本流/数据流&#xff08;二级制格式&#xff09; 文本流 &#xff08;依赖平台&#xff0c;不同平台可能乱码&#xff09;涉及文件编码 #include <QTextStream>操作的都是基础数据类型&#xff1a;int float string //Image Qpoint QRect就不可以操作 需要下面的 …

ES分片均衡策略分析与改进

从故障说起 某日早高峰收到 Elasticsearch 大量查询超时告警&#xff0c;不同于以往&#xff0c;查看 Elasticsearch 查询队列监控后发现&#xff0c;仅123节点存在大量查询请求堆积。 各节点查询队列堆积情况 查看节点监控发现&#xff0c;123节点的 IO 占用远高于其他节点。…

喜报!聚铭网络实力入选2024年度扬州市网络安全技术支撑服务机构

近日&#xff0c;中共扬州市委网络安全和信息化委员会办公室正式公布了“2024年度扬州市网络安全技术支撑服务机构”名单&#xff0c;聚铭网络凭借其卓越的技术实力与优质的安服能力&#xff0c;在众多竞争者中脱颖而出&#xff0c;光荣上榜&#xff01; 为了健全扬州市网络安…

仿12306校招项目业务五(敏感信息模块)

加密存储 数据加密背景 数据加密是指对某些敏感信息通过加密规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 涉及客户安全数据或者一些商业性敏感数据&#xff0c;如身份证号、手机号、卡号、客户号等个人信息按照相关部门规定&#xff0c;都需要进行数据加密。…

程序人生——Java中基本类型使用建议

目录 引出Java中基本类型使用建议建议21&#xff1a;用偶判断&#xff0c;不用奇判断建议22&#xff1a;用整数类型处理货币建议23&#xff1a;不要让类型默默转换建议24&#xff1a;边界、边界、还是边界建议25&#xff1a;不要让四舍五入亏了一方 建议26&#xff1a;提防包装…