【Linux】进程(3):运行,阻塞,挂起

大家好,我是苏貝,本篇博客带大家了解Linux进程(3),如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • (A) 运行(R)
  • 进程切换
  • (B)阻塞(S/D)
  • (C)挂起

下图是 操作系统 的5种状态
在这里插入图片描述

在Linux中,运行和就绪状态可以合并,用状态R表示。阻塞状态用S/D表示。终止状态用Z/X表示

(A) 运行(R)

下面的内容不是Linux调度的方法,是操作系统教材调度算法的一种。 因为这种调度算法比较简单,所以我们先了解这种

运行进程一定是在CPU里运行的,所以有一个CPU

运行进程时,要将自己的代码和数据从磁盘加载到内存中,操作系统为管理进程,会在内部为每个进程创建对应的内核数据结构task_struct,task_struct能够找到对应的代码和数据。
在这里插入图片描述

为了方便操作系统对进程的管理,管理进程变成了对链表(每个结点都是一个进程的task_struct)的增删查改。
在这里插入图片描述

新增一个进程就是将新进程的代码和数据加载到内存,再由操作系统提供对应的task_struct,再将task_struct连接到队列中
在这里插入图片描述

删除一个进程就是根据pid找到对应的进程,释放掉进程的task_struct和内存里的代码和数据的空间,再将链表重新链接起来

在这里插入图片描述

每个CPU都要维护一个运行队列。运行队列本身也是一个结构体
在这里插入图片描述

所以进程要运行,首先要将进程放入运行队列当中
在这里插入图片描述

往后CPU要调度一个进程,只要找到它对应的运行队列,将队列头部的进程的代码和数据加载到CPU里的寄存器中。严格意义上来讲,只要进程被放入CPU上,进程的状态就是R
在这里插入图片描述

但是很多操作系统的教材上会说:只要进程在运行队列中,进程的状态就是R。这里的R表示进程已经准备好了,可以随时被调度了。但在Linux中,并没有already状态(就绪状态),所以我们可以把就绪状态和运行状态压缩成一个状态。但如果实在要将这两个状态分开来的话,那么可以理解为只有在CPU上跑的是运行状态,在运行队列里的就是就绪状态

进程切换

一个进程一旦持有CPU,会一直运行到这个进程结束吗?不会,因为存在时间片轮转调度算法,该算法是基于时间片进行轮转调度的,核心思想是将CPU时间分成固定大小的时间片,每个进程在一个时间片内执行,如果时间片用尽而进程未完成,那么该进程就会被放到就绪队列的末尾,等待下一次轮到它执行。这种方式可以保证每个进程都有机会在CPU上执行,避免了某个进程长时间独占CPU的情况,提高了系统的公平性。

比如进程a是个死循环,时间片是2毫秒,那么2毫秒之后,操作系统会直接将进程a从CPU上剥离下来,重新列入运行队列的尾部,让下一个进程b进行我们的调度
在这里插入图片描述

这就是为什么哪怕我们电脑只有一个CPU,我们同时开着QQ,微信和网易云,如果QQ死循环了,微信和网易云还能正常使用的原因

并发:让多个进程以切换的方式进行调度,在一个时间段内同时得以推进代码

如果1个计算机里有2个CPU,那么它们分别维护一个运行队列。也就是说,这2个CPU可以同时调度不同的程序
在这里插入图片描述

并行:任何时刻,都同时有多个进程在真的同时运行

现在我的电脑只有一个CPU(CPU内部会有非常多的寄存器,如:eax,eip,CR0~CR4等等),存在进程1和进程2
在这里插入图片描述

CPU先调度进程1,此时CPU的寄存器中会保存进程1的临时数据。但是在时间片内,进程1还没有执行完成,要从CPU上剥离,这时CPU会将寄存器内的临时数据存入进程的task_struct中,CPU的寄存器内的临时数据也叫进程的上下文,即将上下文数据存入task_struct中。等到再次被CPU调度时,CPU就会从上一次执行结束的位置开始执行。
再调度进程2,过程同上

进程在切换,最重要的一件事情:上下文数据的保护(CPU将寄存器中的临时文件存入task_struct)和恢复(上下文数据存入寄存器中)

CPU内的寄存器本身是硬件,具有数据的储存能力,CPU的寄存器硬件只有一套。
CPU内部的数据可以有多套,有几个进程,就有几套和该进程对应的上下文数据

拓展:
在这里插入图片描述

上面这个简单的C语言代码中,c是局部变量,那是通过什么能将c的值返回呢?寄存器

(B)阻塞(S/D)

在了解阻塞状态之前,先思考一个问题:我们使用C语言里的scanf函数,如果我们不在键盘上输入,那么该进程处于什么状态?

修改.c文件
在这里插入图片描述
在这里插入图片描述

我们发现,当scanf等待我们键盘输入时,进程状态是S
在这里插入图片描述

所以这本质上就是阻塞。这是在等待键盘资源是否就绪,简单来说就是键盘上有没有被用户按下的按键以及按键数据是否交给进程。

我们再来画一下冯诺依曼体系结构

先画出结构的倒数第一二层:硬件和驱动层(每个硬件的厂商都会写自己硬件的驱动程序)
在这里插入图片描述

我们知道,操作系统是管理软硬件资源的。管理软件:进程等。那操作系统是怎么管理硬件的呢?依旧是先描述,再组织。下面所写的并非是Linux内核的真正实现,而是它的原理的说明

比如说我们定义一个设备在操作系统的结构体。进程为什么能够等待设备资源,因为设备的结构体有等待队列
在这里插入图片描述

每个设备都有自己的struct device,操作系统为了将设备管理起来,将所有设备的struct device用指针联系起来。最终,对设备的管理就变成了对设备链表的增删查改

在这里插入图片描述

现在我们要启动testStatus进程,进程里面有scanf函数。该进程要被CPU调度,执行scanf()函数的时候发现要访问键盘资源,而操作系统检测键盘的工作状态发现它并不ok(用户没有在键盘上输入)

在这里插入图片描述

所以将该进程从运行队列中剥离出来,放入键盘的等待队列中。比如又有一个进程要等待磁盘资源,那么也要将该进程从运行队列中剥离出来,放入磁盘设备的等待队列中。所以,不是只有CPU才有运行队列,各种设备也有自己的等待队列
在这里插入图片描述

此时有2个进程不在运行队列,就不会被调度,因此叫这样的进程为阻塞进程。

等到用户按了键盘上的按键,通过驱动程序会被操作系统最先知道,知道之后,将设备的struct device的工作状态改为ok,再将在设备队列里的进程重新链回到运行队列中(这个过程叫唤醒),等CPU再次调度时,会执行scanf后续代码,将键盘设备的数据读取

在这里插入图片描述

阻塞和运行的状态变化,往往伴随着pcb被链入不同的队列中。入队列的不是代码和数据,而是进程的task_struct

(C)挂起

在这里插入图片描述

假设只有3个进程,如果此时操作系统内存特别吃紧,且进程处于阻塞态,那么操作系统会将内存中的代码和数据加载到磁盘的swap分区,内存中的代码和数据的空间会被释放,进程任然存在。这个过程叫唤出。

swap分区一般是内存的1-2倍大
在这里插入图片描述

如果进程等待的资源就绪了,开始被调度了,即状态由S变成R,那么进程对应的代码和数据会从swap分区加载到内存中。这个过程叫唤入
在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第127题单词接龙

题目&#xff1a; 题解&#xff1a; class Solution {Map<String, Integer> wordId new HashMap<String, Integer>();List<List<Integer>> edge new ArrayList<List<Integer>>();int nodeNum 0;public int ladderLength(String beginW…

计算机网络学习实践:配置主机通过DHCP获取IP并通过域名访问web服务器

计算机网络学习实践&#xff1a;配置主机通过DHCP获取IP并通过域名访问web服务器 点一点就能配置&#xff0c;不需要输入命令 1.实验准备 实验环境&#xff1a;思科的模拟器 实验设备&#xff1a; 3个服务器&#xff0c;1个二层交换机&#xff08;不是三层的&#xff09;&a…

ctfshow-web入门-信息搜集(web11-web20)

目录 1、web11 2、web12 3、web13 4、web14 5、web15 6、web16 7、web17 8、web18 9、web19 10、web20 1、web11 域名其实也可以隐藏信息&#xff0c;比如flag.ctfshow.com 就隐藏了一条信息 查询域名的 DNS 记录&#xff0c;类型为 TXT&#xff08;域名的说明&#…

20、matlab信号波形生成:狄利克雷函数、高斯脉冲和高斯脉冲序列

1、狄利克雷函数生成波形diric()函数 语法&#xff1a;y diric(x,n) 返回n次的狄利克雷函数对输入数组x的元素求值。 1&#xff09;diric()函数 代码 x linspace(-2*pi,2*pi,301);%定义x取值 d6 diric(x,6); d7 diric(x,7); subplot(2,1,1) plot(x,d6) ylabel(n 6) tit…

YOLOv10:实时端到端目标检测的新突破

目标检测作为计算机视觉领域的一个核心问题&#xff0c;其关键在于能够在图像中准确识别并定位对象。随着深度学习技术的发展&#xff0c;基于深度神经网络的目标检测方法不断涌现&#xff0c;其中YOLO&#xff08;You Only Look Once&#xff09;系列算法以其优异的实时性和准…

【PB案例学习笔记】-14使用次数和日期限制

写在前面 这是PB案例学习笔记系列文章的第14篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

如何注册及使用飞浆AI Studio资源跑模型

之前已经介绍过如何注册及使用Kaggle平台的资源跑模型&#xff0c;今天我们将介绍如何注册及使用飞浆AI Studio资源​。 一、AI Studio简介 飞桨AI Studio是基于百度深度学习开源平台飞桨&#xff08;PaddlePaddle&#xff09;的人工智能学习与实训社区。我们先让文心一言给对…

数字组合问题(回溯法)

一、问题描述 找出从自然数1、2、……、n中任取r个数的所有组合。 问题的状态空间为&#xff1a; E{&#xff08;x1&#xff0c;x2&#xff0c;...&#xff0c;xr&#xff09;∣xi∈S &#xff0c;i1&#xff0c;2&#xff0c;...&#xff0c;r } 其中&#xff1a…

现成方案 - 复刻版类似 Perplexity 与秘塔 AI 的搜索引擎

这里为大家带来一个极具创新性的开源 AI 搜索引擎&#xff0c;其灵感源自 Perplexity。 该搜索引擎主要具备以下功能&#xff1a; 能够接收用户提出的各种问题。借助 Bing 搜索 API 可查找出前 6 个结果并予以展示。会抓取这 6 个链接的文本内容&#xff0c;将其作为重要的上下…

基于springboot实现青年公寓服务平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现青年公寓服务平台系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;房屋信息因为其管理内容繁杂&#xff…

Spark 3.5.1 升级 Java 17 异常 cannot access class sun.nio.ch.DirectBuffer

异常说明 使用Spark 3.5.1 升级到Java17的时候会有一个异常&#xff0c;异常如下 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.htm…

面试题:谈谈你对观察者和订阅发布的理解

面试题&#xff1a;谈谈你对观察者和订阅发布的理解 1. 观察者设计模式 场景引入之杂志订阅&#xff1a;小王想要购买一本尚未出版的杂志&#xff0c;他向出版社预订该杂志并提供联系方式&#xff0c;一旦该杂志出版&#xff0c;出版社就会根据小王预留的联系方式通知他可以来…

YOLOv8_obb预测流程-原理解析[旋转目标检测理论篇]

YOLOv8_obb的预测流程,主要分预处理模块、推理模块和后处理模块。这里面有很多内容是和目标检测预测流程是重合的,主要区别在于Angle分支、NMS后处理以及regularize_rboxes部分。本文也主要介绍一下这三个模块,其他模块可以结合YOLOv8预测流程-原理解析[目标检测理论篇]一起…

最新版wordpress网创资源美化以及更新自动同步插件

最新更新了美化右侧悬浮图标 底部分类板块&#xff0c;以及文章自动同步插件 1.支持分类替换 将主站同步过来的文章分类进行替换 2.支持本地化文章图片 &#xff08;使用储存桶可能会导致无法保存图片&#xff09; 3.支持自定义文章作者&#xff08;选择多个作者则同步到的…

辩证 逻辑学 | 洞察 事物矛盾及变化规律 在形式逻辑基础上 学会辩证思维(40节课)

课程下载&#xff1a;辩证逻辑学洞察事物矛盾及变化规律在形式逻辑基础上学会辩证思维&#xff08;40节课&#xff09;-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 在形式逻辑的基础上&#xff0c;学会 辩证思维 敏锐 洞察事物发展变化的规…

RPG Maker MV角色战斗动画记录

角色战斗动画记录 角色战斗状态判断的语句赋值 战斗管理战斗精灵创建精灵进行角色的更新 角色战斗状态 角色的战斗状态是由 Game_Battler 类中的 _actionState 属性的字符串决定的&#xff0c;它有哪些值呢&#xff1f; undecided 未确定或者说是操作状态inputting 输入waiti…

开源VS闭源:大模型之争,究竟谁更胜一筹?

随着人工智能技术的快速发展&#xff0c;大模型作为其中的核心组件&#xff0c;已经引起了业界的广泛关注。在大模型的研发过程中&#xff0c;开源与闭源成为了两个备受争议的话题。究竟开源与闭源谁更好&#xff1f;本文将从多个角度进行深入分析&#xff0c;为大家揭示真相。…

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网&#xff1a; https://…

godot.bk:how to add map to the game

1.项目构建如下&#xff0c;map是我们点击start之后才渲染出来的 mian.tscn --main.gd --background(textureact) --start(button) --button.gd sourceFile map.tscn --tilemap --tileset 2.main.gd&#xff1a;注意main.gd并不定义信号&#xff0c;它只是接收信号而已 extend…

新书推荐:1.2 动态链接库与API

本节必须掌握的知识点&#xff1a; kernel32.dll user32.dll gdi32.dll ■动态链接库 最早的软件开发过程&#xff0c;所有的功能实现都是有程序员独立完成的。在这个过程中&#xff0c;我们很快就会发现&#xff0c;有很多常用的功能模块是可以重复利用的&#xff0c;我们将…