操作系统层面下——进程状态讲解

news2024/11/27 4:21:38

      目录

        一.进程的状态:运行态

        1.什么是运行状态?

        2.进程进入内存的详细图解:

        总结:

        二.进程的状态:阻塞态 

        1.什么是阻塞状态?

        三.进程的状态:挂起态

        1.什么是挂起态?

2.阻塞与挂起的区别:


        通过上一篇博客对进程的讲解,我们了解了进程就是一个个在磁盘中的二进制可执行文件运行时被加载到内存后就成为了进程。其实进程也是分状态的,在很多操作系统的书中提到进程的状态有新建、就绪、运行、挂起、阻塞、死亡、停止...... 进程之所以能被描述出有这么多状态,本质都是用来满足不同的运行场景的。下面我将介绍最重要的三种进程状态

一.进程的状态:运行态

        1.什么是运行状态?

        当一个进程被调入CPU的运行队列时就是处于运行状态了。

        在生活中,我们用的电脑一般情况下都只有一个CPU,而CPU是用来执行和处理进程的,将具体一点就是每一个CPU都会有一个运行队列(runQueue),运行队列的底层实现是一个数据结构链表,它里面的各个节点元素就是各进程的属性task_struct(PCB),所以CPU可以根据运行队列看到各节点进程的状态和数据信息。

        2.进程进入内存的详细图解:

        如上就是进程运行时在被加载到内存后的详细步骤图,运行队列中存放的是该进程的PCB结构体,根据队列先进先出的原则,CPU会对先加载进来的进程PCB进行代码和数据上的执行处理 。

        举一个工作上的例子进行理解:当我们在找工作的过程中,向公司投递了简历,这里的投简历并不是把自己投进了公司,而是把自己的简历做成文件投进去了,那么简历从哪里来呢?是我们自己制作了一份包含了自己的姓名、年龄、电话、性别、技术特长...... 的文档,这就是我之前所提到的:“先描述” 即整理出自己的信息数据!

        然后公司收到简历后,便开始筛选,当你通过筛选后,你的简历就会被放在HR的办公桌上,公司会安排你进行下一轮的面试,这时你就相当于是进程,简历相当于是PCB。而运行队列就是HR,面试的过程相当于是你进入了运行队列,这便是后三个字:“再组织” ——HR将一个个人的简历链接起来进行面试。

        若你通过了面试,公司的系统(相当于是CPU)则会对你的身份进行入职办理(CPU对进程进行运算处理)。

总结:

        1.一个CPU只有一个运行队列。

        2.当可执行文件.exe程序运行起来后,便会进入内存成为进程,而操作系统会形成一个PCB去概括该进程的所有属性(Linux下是形成struct task_struct结构体),所谓的进程进入运行队列,本质上是该进程的PCB被操作系统调入了运行队列中。

        3.进程的PCB只要处在运行队列中,就表明该进程是在运行状态。

所以“只有该进程的PCB正在被CPU运行处理时才算是运行状态 。”这种想法是错误的,因为CPU的运算速度相当快,是一瞬间的事情,所以只要PCB在队列中就是运行状态!

        4.对于上面投简历这个案例,我还想说一点:当我们投简历给公司后,公司经过筛选一部分的简历进入下一轮后,会给这些人打电话说:"恭喜x先生/女士,我们xx公司通过了你的简历,请在未来几天内等候安排面试!",在HR说这句话之前,我们正在忙着自己的事情(可以是睡觉,打游戏,吃饭),而在HR说过这话以后,我们作为进程,就达到了运行状态。

        5.不要只以为,进程只会占用CPU的资源,如上图,进程也可能会占用键盘、网卡、显示器、磁盘等硬件资源!那么进程所处的不同状态,就是进程处在CPU和非CPU的队列中,等待着该硬件空闲处理去使用,这就是下面我要提到的进程的第二种状态——阻塞状态!


二.进程的状态:阻塞态 

1.什么是阻塞状态?

        举个例子理解:当我们上网时,在网上下载一个游戏,找到下载路径开始下载,此时右上方就会出现一个软件下载的进度条,在下载的过程中家里停电了,电脑被迫断网,导致进程停下来了,那么该进程的状态就称为是阻塞状态。

        因为该进程是需要占用网卡(硬件资源的),但是CPU等不了那么长时间(网卡的运算传输很慢的),所以该进程就只能被操作系统调出运行队列,放到网卡的队列中等待着网卡处理器的运行中,这时该进程从运行状态就转换到了阻塞状态。

       上图中,橙色的框代表着各个硬件资源的老大,相当于是小型的cpu也可以。在这些硬件处理器中,都有各自的等待队列,专门用于存放进程需要占用这些硬件资源的位置,相当于医生给你看病的半中间,让你先去抽血,拍CT,化验等过程,在抽血的过程中也需要进入队列排队,只要进程进入这些硬件处理器的队列,那么这个进程就是处于“阻塞状态”!

        上面的例子中提到,进程A由于需要网卡硬件资源,导致CPU停止了该进程A的运行,将其转入了网卡的等待队列,运行态变为阻塞态。此时若是有其他进程B,C,D也正在被网卡执行时,那该进程A就需要在队列中等待,若没有则会立即被网卡执行处理。

注:阻塞态的进程仍处于内存中,进程的代码数据也会移动到相应的所需要的硬件资源存放处。


三.进程的状态:挂起态

1.什么是挂起态?

        挂起态和阻塞态息息相关,也就是说进程在进入挂起态之前一定处于阻塞态!

       举个例子:当有三个进程1,2,3都需要申请磁盘资源时,操作系统将他们都调入了磁盘的等待队列中,这时它们处于阻塞状态,磁盘处理器开始一个个的运行处理这些调过来的PCB,假如此时磁盘处理进程的空间已经快满了,又有一个进程需要申请磁盘资源,系统需要把它调进磁盘的等待队列,但是该队列已经放不下了,于是系统会将队列中前面还需要等待时间较长的PCB3的代码数据保存下来,然后进程3就可以暂时被磁盘的进程空间给释放掉了,以便于给后面调过来的进程留有空间。

        这就是操作系统对于进程的普遍处理,若是某个硬件处理器的运行空间不够,就会将在该硬件处理器等待时间较长的进程资源数据先保存下来,然后暂时释放掉该进程所占的空间,让后来的想要申请该硬件资源的进程也能够进来。

        当PCB1,PCB2都被磁盘处理运算完后,轮到PCB3时,系统会再将PCB3的代码资源从之前保存过的磁盘空间唤醒,调回磁盘处理器中开始处理,处理完后PCB3就会被系统再调回CPU的运行队列,由CPU继续从上一次的断点处开始处理。

                                        阻塞不一定挂起,挂起一定阻塞。

2.阻塞与挂起的区别:

        阻塞:当进程正在被CPU运算处理时,需要申请CPU以外的资源,系统会将其从运行队列调出,进而调入需要申请资源的task_strucy结构体中(某某处理器)的等待队列,该状态称为阻塞状态。

        当该进程被某某处理器处理完后,系统会将其送回CPU的运行队列中,继续被CPU运算处理,该进程从“阻塞状态”----> “运行状态”

        挂起:当进程的PCB进入某某资源处理器的等待队列后,由于又有新的进程需要申请进入该资源处理器的等待队列,系统不得不将等待时间长的进程的数据信息保留下来,拿出去以便给后面的新进程腾出空间,这是的进程状态被称为“挂起状态”

        当资源处理器能够处理之前被拿出去的进程时,系统会将其唤出,把该进程C的资源再拿回来进行处理,这时该进程从“挂起状态”--->"阻塞状态"        

以上就是从宏观层面上对进程的三种重要状态的讲解了。

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

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

相关文章

xss跨站之代码及http only绕过

什么是http only,在cookie中设置了http only属性,那么通过js代码无法获取cookie,并不能防止xss漏洞,在上一节的靶场网站源代码里面,写上这一串代码就是启动http only 再加上带去cookie的代码 然后我们再去访问网站的后…

线程池各参数学习

线程池学习_alutimo的博客-CSDN博客尚硅谷java并发包JUC线程池部分学习总结https://blog.csdn.net/qq_41228145/article/details/125650075老生常谈 线程池的参数ThreadPoolExecutor.java 的构造器 /*** Creates a new {code ThreadPoolExecutor} with the given initial* par…

PLC【西门子】几种常见的连接口和通讯协议简介

S7-200 PLC支持的几种通讯协议 一、PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备,从站设备响应,从站不能主动发出信息。主…

简述什么是微前端 微前端几种框架的区别

微前端就是将各个模块分成不同项目 方便多个团队一起开发互相不影响 例如:a团队维护较老的项目使用angular,b团队开发react,c团队开发vue 。按道理说abc三个项目并没有关联,但是他们又都是公司内部管理的系统。需要集成在一起 &…

智能排班系统 【管理系统功能、操作说明——中篇】

文章目录 页面与功能展示企业管理角色管理用户管理系统管理员身份使用企业管理员身份使用门店管理员身份使用 门店管理职位管理排班规则设置节日管理消息管理 页面与功能展示 企业管理 企业管理页面如图 34所示,在企业管理页面,系统管理员可以查询所注…

IAT Hook

一、IAT HOOK介绍 IAT (Import Address Table) HOOK 是一种在 Windows 程序中进行函数钩子的技术。它通过修改程序的导入地址表来实现对目标函数的替换或拦截。 在 Windows 运行时,程序需要调用其他模块(DLL)中的函数来完成特定的功能。为了…

java项目打包方式

普通项目打包 项目内容很简单,只是引用了一个三方包。 打包步骤 File-Project Structure... 点击确定后选择Build - Build Artifacts.. 选择build即可,可以查看编译日志 maven项目打包 若果是普通项目就先转为maven项目。 右键项目选择第二项add frame…

【Netty】Netty 解码器(十二)

文章目录 前言一、编解码概述1.1、编解码器概述1.2、Netty 内嵌的编码器 二、解码器2.1、ByteToMessageDecoder 抽象类2.1.1、常用方法2.1.2、将字节转为整形的解码器示例 三、ReplayingDecoder 抽象类四、MessageToMessageDecoder 抽象类总结 前言 回顾Netty系列文章&#xf…

K-Means算法实现鸢尾花数据集聚类

目录 1. 作者介绍2. K-Means聚类算法2.1 基本概念2.2 算法流程 3. K-Means聚类算法实现3.1 鸢尾花数据集3.2 准备工作3.3 代码实现3.4 结果展示 4. 问题与解析参考链接 1. 作者介绍 张勇,男,西安工程大学电子信息学院,2022级研究生 研究方向…

第3章“程序的机器级表示”:算术和逻辑操作

文章目录 3.5 算术和逻辑操作3.5.1 加载有效地址3.5.2 一元和二元操作3.5.3 移位操作3.5.4 讨论3.5.5 特殊的算术操作 3.5 算术和逻辑操作 下图列出了一些双字整数操作,分为四类。 二元操作有两个操作数,而一元操作只有一个操作数。 描述这些操作数的…

极光笔记 | EngageLab Push的多时区解决方案

01、引言 多时区问题一直是全球客户和终端用户面临的挑战之一。EngageLab Push 致力于解决这个问题,确保全球各地的终端用户可以平等地享受到同样的推送服务,同时让客户能够更好地管理不同时区的应用和对应的终端用户。 02、解决多时区问题的总体方案 1…

软件测试----软件开发模型

1、瀑布模型 (1)瀑布模型如下 (2)瀑布模型的缺点: 在瀑布模型中,测试是在编码结束后才介入,对软件开发流程前期质量是没有保障的 (3)采用瀑布模型的场景: …

31 KVM管理系统资源-管理虚拟内存NUMA

文章目录 31 KVM管理系统资源-管理虚拟内存NUMA31.1 NUMA简介31.2 配置Host-NUMA操作步骤 31.3 配置Guest-NUMA操作步骤 31 KVM管理系统资源-管理虚拟内存NUMA 31.1 NUMA简介 传统的多核运算使用SMP(Symmetric Multi-Processor)模式:将多个…

Flume系列:Flume 自定义Interceptor拦截器

目录 Apache Hadoop生态-目录汇总-持续更新 1:Interceptor拦截器的使用场景 2:Interceptor拦截器在采集流程中的位置 3:自定义Interceptor拦截器 pom.xml 拦截器java代码 打包上传 4:使用自定义的拦截器 方式一&#xff1…

Springboot +spring security,自定义认证和授权异常处理器

一.简介 在Spring Security中异常分为两种: AuthenticationException 认证异常AccessDeniedException 权限异常 我们先给大家演示下如何自定义异常处理器,然后再结合源码帮助大家进行分析 二.创建项目 如何创建一个SpringSecurity项目,前…

分布式锁和事务关系的细节

使用redssion在redis上以及结合自定义注解利用spring的环绕切面来实现分布式锁功能 代码示例 controller、service层 RequestMapping("insertNumber/{number}/{id}") public boolean insertNumber(PathVariable Long number,PathVariable Long id){return testSer…

rust 中protobuf生成与使用

首先创建一个项目proto 进入到这个文件夹中 创建我们的proto文件 初始化的项目结构是这个样子的 新建一个hello.proto文件内容如下 syntax "proto3";package hello;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {} }message HelloRequest …

干货 | 师兄手把手教你如何踏上科研道路

Hello,大家好! 这里是壹脑云科研圈,我是喵君姐姐~ 今天,邀请到鲁小白,给大家分享一下他踏上科研道路的心路历程。 大家好,我是鲁小白,我真正进入科研的时间,研究生3年再…

【C++】类和对象——类的引入、类的访问限定符、类的作用域、类的实例化、类的储存、this指针的引出和特性

文章目录 1.类的引入2.类的访问限定符3.类的作用域4.类的实例化5.类的储存6.this指针6.1this指针的引出6.2this指针的特性 1.类的引入 C是在C的基础上加以扩展。 在C语言中,我们想要让一个类型含有多种成员变量,我们使用结构体;而在C中我们可…

Doris节点扩容及数据表

扩容和缩容 上篇文章简单讲了doris的安装,本章分享的是doris中fe和be节点的扩容缩容以及doris的数据表1、FE 扩容和缩容 使用 MySQL 登录客户端后,可以使用 sql 命令查看 FE 状态,目前就一台 FE mysql -h linux -P 9030 -uroot -p mysql&…