当前位置: 首页 > news >正文

进程状态的学习

进程状态就是 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

相关文章:

进程状态的学习

进程状态就是 task_struct 内的一个整数 状态间是可以进行转化的 运行: 每一个框都是进程的task_struct,都有唯一的pcb和pid来标识它的唯一性 让CPU选择一个进程去运行,本质是选择一个进程的PCB去运行,task_struct里一定有内存指…...

Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)

Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势) Composition API 的优势1. Options API 存在的问题2. Composition API 的优势 Composition API 的优势 1. Options API 存在的问题 笔记 使用传统OptionsA…...

close and shutdown?

背景&#xff1a;我们要讲述的是网络编程中常用的两个API&#xff1a; #include <unistd.h> int close(int fd); #include <sys/socket.h> int shutdown(int sockfd, int how); 以及TCP的半连接&#xff0c;半打开。 shutdown函数的行为依赖第二个参数区分&#xf…...

PostgreSQL + hasura + Apollo + GraphQL + React + Antd

技术栈 PostgreSQL hasura Apollo GraphQL React Antd 适用于复杂的查询,快速开发 环境安装 安装PostgreSQL hasura,使用docker安装 使用 Docker Compose 部署时&#xff0c;它会同时启动两个容器PostgreSQL和 Hasura GraphQL ,如下 version: "3.6" serv…...

Android笔记【10】

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 二、内容 学习一段代码&#xff1a; val drawerState rememberDrawerState(DrawerValue.Closed)val scope rememberCoroutineScope()Scaffold (topBar{TopAppBar(navigationIcon {IconButton(onClick {scope.lau…...

Leetcode打卡:N皇后

执行结果&#xff1a;通过 题目&#xff1a;51 N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...

Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体

目录 1. struct clk_hw 2. struct clk_ops 3. struct clk_core 4. struct clk_notifier 5. struct clk 6. struct clk_gate 7. struct clk_divider 8. struct clk_mux 9. struct clk_fixed_factor 10. struct clk_fractional_divider 11. struct clk_multiplier 12…...

[Deep Learning] 深度学习中常用函数的整理与介绍(pytorch为例)

文章目录 深度学习中常用函数的整理与介绍常见损失函数1. L2_loss | nn.MSELoss()公式表示&#xff1a;特点&#xff1a;应用&#xff1a;缺点&#xff1a;主要参数&#xff1a;示例用法&#xff1a;注意事项&#xff1a; 2. L1 Loss | nn.L1Loss数学定义&#xff1a;特点&…...

【ETCD】etcd简单入门之单节点部署etcd

etcd 是一个分布式可靠的键值存储系统&#xff0c;用于分布式系统中最关键的数据&#xff0c;主要特点包括&#xff1a; 简单&#xff1a;具有明确的、面向用户的 API&#xff08;gRPC&#xff09; 安全&#xff1a;自动 TLS 支持&#xff0c;并可选的客户端证书认证 快速&am…...

Cadence基础语法

03-Cadence基础语法 0 Cadence基础语法入门&#xff1a;流程编排语言的新星 Cadence是由Uber开发的一种领域特定语言&#xff08;Domain-Specific Language&#xff0c;DSL&#xff09;&#xff0c;专门用于编写可扩展的长时间运行的业务流程。它是Temporal工作流引擎的核心组…...

GAMES101虚拟机使用教程与探讨

写在前面 环境配置请参考作业0的pdf&#xff0c;本文章主要对于配置好环境后怎么使用以及遇到的问题进行探讨&#xff08;要是有更方便的使用方式欢迎在评论区讨论&#xff09;&#xff0c;自己刚开始用的时候也折腾了好久&#xff0c;希望能为后来学习的小伙伴节约一点工具使…...

王道考研编程题总结

我还在完善中&#xff0c;边复习边完善&#xff08;这个只是根据我自身总结的&#xff09; 一、 线性表 1. 结构体 #define MaxSize 40 typedef struct{ElemType data[MaxSize]&#xff1b;int length; }SqList 2. 编程题 1. 删除最小值 题意 &#xff1a;从顺序表中删除…...

算法2--滑动窗口

滑动窗口 滑动窗口经典例题长度最小的子数组无重复字符的最长子串[最大连续1的个数 III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)[将 x 减到 0 的最小操作数](https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/description…...

pycharm或conda中配置镜像源

文章目录 1. 为什么要配置镜像源2. pycharm配置2.1使用pip配置国内镜像源2.2 Pycharm中更改镜像源 3.conda配置镜像源3.1 使用conda命令3.2 文件所在位置&#xff08;进行增删&#xff09;3.3 conda常用的几个命令 参考文献 1. 为什么要配置镜像源 由于Python在下载包时&#…...

C#基础之方法

文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...

JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】

前言&#xff1a; 前面我们分析怎么去预估系统资源&#xff0c;怎么去设置 JVM 参数以及怎么去看 GC 日志&#xff0c;本篇我们分享一些常用的 JVM 调优工具&#xff0c;我们在进行 JVM 调优的时候&#xff0c;通常需要借助一些工具来对系统的进行相关分析&#xff0c;从而确定…...

PostgreSQL 三种关库模式

PostgreSQL 三种关库模式 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777PostgreSQL 提供了三种关库模式&…...

《运放秘籍》第二部:仪表放大器专项知识点总结

一、差分放大器与仪表放大器的讨论 1.1. 仪放的前世今生——差分放大器原理&#xff1f; 1.2. 差分放大的原理 1.3. 差分放大器检测电流 1.4. 差分放大器端一&#xff1a;输入阻抗 1.5. 差分放大器端二&#xff1a;共模抑制比 1.6. 为什么关注输入阻抗&#xff1f;共模抑…...

C++STL之vector(超详细)

CSTL之vector 1.vector基本介绍2.vector重要接口2.1.构造函数2.2.迭代器2.3.空间2.3.1.resize2.3.2.capacity 2.4.增删查找 3.迭代器失效4.迭代器分类 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f68…...

ubuntu环境下安装electron环境,并快速打包

1.配置镜像源 关闭防火墙&#xff0c;命令&#xff1a;sudo ufw disable 1.1配置国内镜像源&#xff1a; vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...