进程状态的学习

news2024/12/27 7:49:48

进程状态就是 task_struct 内的一个整数

状态间是可以进行转化的

运行:

每一个框都是进程的task_struct,都有唯一的pcb和pid来标识它的唯一性

让CPU选择一个进程去运行,本质是选择一个进程的PCB去运行,task_struct里一定有内存指针用来找到我们要运行的对应进程的代码和数据

头部的优先级比较高,尾部的优先级比较低

只要在这个队列里,进程状态都是running,不是说正在被CPU调度的进程才是运行

要么就是正在被CPU运行,要么就是准备好了随时等待被调度

-->运行+准备就绪

阻塞?

例子:

scanf 进程自己就停下来了,等用户输入

准确来说不是等用户输入,而是等待硬件键盘就绪

意义?

等待某种设备或资源就绪,一直不就绪,我们的进程就不会被调度也就卡在那里不动了

OS对软硬件进行管理?

怎么做?

先描述再组织,创建对应的数据结构,所有设备用struct device 来描述起来,为每一个设备构建一个struct device的结点,用指针把设备链接起来,每种设备都是对应底层不同的硬件设备,转化成对链表的增删查改

和我们的进程一样,管理也要先描述再组织

struct device 描述的就是目标设备的所有属性

OS有运行队列也要有设备队列,每个设备都有自己的等待队列

假设我们的CPU正在运行我们的这个进程,运行的时候执行这个进程的代码,发现这个进程要进行canf读取了,读取时OS发现我们要都键盘,转而去帮我们检查键盘的  status 状态,发现我们的键盘并没有任何按键被按下,当前设备不是活跃的,这个进程无法读取到键盘的数据,无法进行执行了,所以OS把这个进程从cpu上拿下来,并且把这个进程从运行队列中移走,把它的pcb链入到我们对应的特定的等待队列当中,一旦链入到其他队列当中,不在运行队列里了,他就永远不会被调度了,那么这个进程就处于阻塞状态,卡在了那里,不在运行队列里,只有在运行队列里才会被cpu调度,在设备的等待队列里了,那这个进程就叫做阻塞

从运行队列到阻塞的本质其实是吧pcb链入到不同的队列结构当中

那我们的进程就在等这个设备里,那我们的键盘被按下了,键盘被我们用户按下时,我们这个进程

他不知道,键盘按下属于硬件就绪OS作为硬件的管理者,硬件状态发生变化,OS要第一时间知道

os一旦知道了,os就直接查看对应的这个就绪设备的这个结点,将状态设置为活跃的,并且检查等待队列,发现等待队列里指针不为空,就将该等待队列里头部的这个进程的状态设置为运行状态,然后将该进程重新链回我们的进程队列里,这个时候进程还没有被调度,键盘上的数据还没有被进程读取,再后来cpu调度这个进程时,这个进程就会继续运行曾经的scanf,然后把对应的数据从设备上读到进程当中,来被我们拿到

从阻塞回到运行状态,本质上是找到我们的pcb,再把我们的pcb链回到运行队列里面,这样他就变成运行状态了

阻塞挂起:

有一些数据当前不会被立即访问,但是他们还是占着内存

我们这些等待状态的进程,这些进程的代码和数据不会被执行使用,除非这个设备已经就绪了,他没有就绪的时候,pcb代码数据都是闲置的,占着内存空间

内存不足的时候我们OS就要去处理

我们的磁盘存在一个swap交换分区,干什么的?

我们的内存严重不足,把阻塞状态进程的代码和数据直接交换到我们对应的磁盘的swap分区上

只保留进程的pcb,把对应的代码和数据换出到对应的磁盘上,再想运行时,就再把资源还给他们

OS就把这些在阻塞队列当中的进程的代码和数据交换到磁盘当中,此时这些进程的状态就叫做阻塞挂起

内存不足时,OS要做一些内存置换的办法,把一些不会被调度的进程或相关内存块交换到对应的磁盘上,这个时候,这些没有代码和数据只有PCB的进程成为阻塞挂起

OS一旦好了,就会把我们对应的进程曾经换入到磁盘的代码和数据重新加载到内存,重新构建指针映射,让我们找到,把曾经加换到磁盘当中的代码和数据换入内存,换入内存之后形成完整进程。再把这个完整进程放到运行队列里,这个过程叫做swap交换分区的换入和换出操作

被换出到交换分区称为阻塞挂起

换入时,把阻塞挂起进程重新回到运行队列中,该进程就可以继续被调度

挂起是把对应进程的代码和数据挂到外设上

运行挂起状态:

如果这样内存还是不够,OS就只能把正在运行队列末端的进程的代码和数据也全部交换到交换分区真正调度到我们时再换回来

就算是有很多CPU,也不可能调用全部的进程

此时,我们又把这个称之为运行挂起状态

挂起本质是把进程代码和数据换入换出到磁盘swap交换分区里

理解内核链表的话题

首先设置 list_head 的结点,包含next和lprev指针

定义一个结构体(内核当中的任何一个结构体)

链表的结点是不包含任何的数据的,而是把链表的结点的next和prev指针单独封装成一个结点类型,把这个结点类型作为新的目标数据结构的一个成员

有很多个 task_struct  连接节点的时候,我们这个结点是怎么链接的?

并不需要让next直接指向下一个 task_struct

next指针指向的是下一个 list_head 

我们以前的这个链表结点的next都是会指向下一个的整个node

Linux内核当中我们的next只会指向目标结构体内部的某个成员对象

比如这里的links

我们要遍历整个进程,能从这个links到下一个links,那一部分是很方便遍历的

要是我们想访问 task_struct 结构体里面的其他属性呢?

-->

在一个结构体里面,结构体变量本身的地址和结构体变量的第一个成员的地址在数字上是相等的

一个结构体内,所有内部成员的地址从上往下是依次增大的

我们要访问结构体里面任何的属性怎么做到呢?

强转

我们认为从0号位置地址处就存在task_struct结构体,然后我们再直接去访问它对应的links再对他进行取地址,

-->我们就得到了links相较于结构体开始位置的偏移量

-->我们只知道当前linsk的地址

拿到next的值,它的值就是下一个结构体变量links的起始地址

-->减去偏移量,此时整个指针的内容就指向结构体的头部了

再强转成 struct task_struct,这样未来这个结构体的所有属性我们都能访问了

可以在 struct task_struct 内部有很多个这样的结点

我们可以在这个字段把进程用双链表链接起来

可以把任何 struct task_struct 一套对象,一种属性的每一个 struct task_struct 既属于运行队列,又属于全局列表

只要是结点类型的,可以放到我们想放的任何地方

-->

一个 pcb在内核当中只存在一份,可以同时隶属于多种数据结构

状态:

R状态

S  阻塞

t:追踪状态

要被debug,断点:进程被暂停了

T 暂停

D 深度睡眠,不可中断睡眠,深度睡眠

S 休眠状态,可中断休眠,浅睡眠

X 死亡状态,结束状态

Z

僵尸--为了获取退出信息

我们创建子进程的目的,是为了让子进程完成某种事情的

结果相关的信息,父进程得知道

所以在子进程退出之后,父进程获取子进程退出之前,就必须有一个叫做Z状态

代码和数据可以释放掉,但必须维持进程退出的基本信息,让我们的父进程知道我们退出的信号

信息保存在 task_struct

父进程不获取,就一直是那个状态

模拟验证  Z ?

如果父进程一直不管,不回收,不获取子进程的推出信息,那么Z就会一直存在

pcb就一直维护,内存就一直占用-->内存泄漏问题

进程退出了,内存泄漏问题就不在了

启动之后不退出的,我们称之为常驻内存的进程-->常驻内存

关于内核结构申请的

维护一张废弃的task_struct的列表  ,叫做unuse

我们可以释放掉,也可以不释放,不释放,我们把这个进程pcb放到我们的unuse列表里,可以让其他列表初始化去使用

形成了,类似数据结构对象的数据缓存,可以加速我们创建进程和释放进程的速度

-->slab

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

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

相关文章

PDF版地形图矢量出现的问题

项目描述:已建风电场道路测绘项目,收集到的数据为PDF版本的地形图,图上标注了项目竣工时期的现状,之后项目对施工区域进行了复垦恢复地貌,现阶段需要准确的知道实际复垦修复之后的道路及其它临时用地的面积 解决方法&…

Ubuntu20.04离线安装全教程(包括DellR940重置Raid 5、安装Ubuntu、设置root、安装nvidia英伟达显卡驱动及设置防火墙白名单)

本文记录重装Ubuntu20.04的所有记录,从服务器磁盘阵列重新排列、Ubuntu 20.04系统安装、配置root权限、安装Nvidia显卡驱动以及设置防火墙白名单的全部操作。 每一部分参考的博客的出处会放置于段落末尾,表示感谢! 一、重置服务器磁盘阵列&…

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日,华为新品发布会引起众多关注。发布会上,华为常务董事余承东专门提到,华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”,并且表示经过华为和支付宝的共同优化,使用“碰…

手机中的核心SOC是什么?

大家好,我是山羊君Goat。 常常听说CPU,中央处理器等等的,它是一个电脑或单片机系统的核心,但是对于SOC可能相比于CPU了解的人没有那么广泛。 所以SOC是什么? SOC全称是System on Chip,就是片上系统&#…

理解字母形状,从而获得含义

英文字母,都是象形符号,所以,理解其形象,所象之形,是一项重要的工作,和非常有意义事情。也是我们快速记住大量单词,将单词从底层逻辑开始理清,融会贯通扩展记忆容量的重要办法之一。…

新型大语言模型的预训练与后训练范式,阿里Qwen

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解,每一步都十分的细致,如果你感兴趣希望多多点赞收藏关注支持 简介:文章对爬虫展开多方面剖析。起始于爬虫的基本概念,即依特定规则在网络抓取信息的程序或脚本,在搜索引擎信息提取上作用显著。阐述其于大数据背景下可助力获取并处理分析数…

LocalDateTime序列化(跟redis有关)

使用过 没成功,序列化后是[2024 11 10 17 22 20]差不多是这样, 反序列化后就是: [ 2024 11 10.... ] 可能是我漏了什么 这是序列化后的: 反序列化后: 方法(加序列化和反序列化注解)&…

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下: UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…

webrtc ios h264 硬编解码

webrtc ios h264 硬编解码 一 ios 系统支持 从ios8开始,苹果公司开放了硬解码和硬编码API(即 VideoToolbox.framework API) 二 主要api 1 主要解码函数 VTDecompressionSessionCreate // 创建解码 session VTDecompressionSession…

【大模型】深度解析 NLP 模型5大评估指标及 应用案例:从 BLEU、ROUGE、PPL 到METEOR、BERTScore

在自然语言处理(NLP)领域,无论是机器翻译、文本生成,还是问答系统开发,模型性能评估指标始终是开发者绕不开的工具。BLEU、ROUGE、PPL(困惑度)、METEOR 和 BERTScore 是五个最具代表性的指标&am…

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异,并支持文…

Navcat连接sqlserver报错:[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0)

Navcat连接sqlserver报错:[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 (0) 原因:navicat没有找到sqlserver驱动 解决:安装sqlserver驱动,下载后双击安装,安装完重新连接就可以了…

IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“

参考文章:https://blog.csdn.net/yueeryuanyi/article/details/14211090 问题:IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“编译都没问题 解决思路 – >【清除缓存】 1. 强制刷新Maven缓存 选择 Maven 标签,Exe…

微信小游戏/抖音小游戏SDK接入踩坑记录

文章目录 前言问题记录1、用是否存在 wx 这个 API 来判断是微小平台还是抖小平台不生效2、微小支付的参数如何获取?3、iOS 平台不支持虚拟支付怎么办?微小 iOS 端支付时序图:抖小 iOS 端支付:4、展示广告时多次回调 onClose5、在使用单例时 this 引起的 bug6、使用 fetch 或…

vue 2 父组件根据注册事件,控制相关按钮显隐

目标效果 我不注册事件,那么就不显示相关的按钮 注册了事件,才会显示相关内容 实现思路 组件在 mounted 的时候可以拿到父组件注册监听的方法 拿到这个就可以做事情了 mounted() {console.log(this.$listeners, this.$listeners);this.show.search !…

服务熔断-熔断器设计

文章目录 服务为什么需要熔断熔断器设计思想熔断器代码实现 服务为什么需要熔断 对于服务端采用的保护机制为服务限流。 对于服务调用端是否存在保护机制? 假如要发布一个服务 B,而服务 B 又依赖服务 C,当一个服务 A 来调用服务 B 时&#x…

【Maven】依赖冲突如何解决?

准备工作 1、创建一个空工程 maven_dependency_conflict_demo,在 maven_dependency_conflict_demo 创建不同的 Maven 工程模块,用于演示本文的一些点。 什么是依赖冲突? 当引入同一个依赖的多个不同版本时,就会发生依赖冲突。…

代理IP地址的含义与设置指南‌

在数字化时代,互联网已经成为我们日常生活不可或缺的一部分。然而,在享受互联网带来的便利的同时,我们也面临着隐私泄露、访问限制等问题。代理IP地址作为一种有效的网络工具,能够帮助我们解决这些问题。本文将详细介绍代理IP地址…