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

【Linux】进程调度与切换

【Linux】进程调度与切换

  • 1. 基本概念
  • 2. 进程切换
  • 3. 进程调度
    • 3.1运行队列实现优先级设计
    • 3.2 处理效率问题
    • 3.3 活动队列与过期队列
    • 3.4 如何解决饥饿问题
    • 3.5 active指针和expired指针

1. 基本概念

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

从上一张进程优先级我们可以知道,进程之间是存在竞争关系的,并且我们要明白一点就是进程在运行的时候,放在CPU中,不是说必须要把代码跑完后才会从CPU下来。在现代的操作系统,都是基于时间片进行轮转的。

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

我们电脑上可以打开微信,也可以打开qq,也可以打开CSDN,这一个个都都是进程,但是我们在使用一个进程的时候都是不会影响到其他的进程。

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

一般情况下,我们的电脑都是只有一个CPU的,一个CPU维护一个运行队列,如果有多个CPU的话就会有多个运行队列,所以如有多个CPU那么同一时间段就可以实现每个CPU都运行一个进程。

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

为什么我们的电脑只有一个CPU但是可以同时运行微信,qq,CSCN呢?那是因为CPU是通过时间片进行轮询运行在运行队列的进程的,只要速度够快我们人是反映不过来一个时间段只运行一个进程的。就好比之前的老电影都是一张一张的图片进行快速的播放来达到动态的效果是一样意思。

2. 进程切换

我们在讲解进程状态的时候,讲过了进程在运行的时候其实本质是放在了CPU运行队列中,基于时间片轮转发方式进行占用CPU的资源,从而实现了多个进程同时运行的现象。而基于运行队列进行切换轮询式的享受CPU资源,这个轮询的方式就叫做式进程切换的过程。

而CPU中其实是由大量的寄存器的,其中我们所了解的一个寄存器eip俗称pc指针是我们之前有接触过的,pc指针的作用就是记录当前执行代码的下一个需要执行的代码的位置。所以当一个进程在CPU中运行的时候,会产生大量的临时数据,而这些临时数据是存放在寄存器当中的。

那我们就会有一个疑问了,既然进程是基于运行队列时间片轮询方式进行切换的,那么CPU是怎么知道切换后的进程再次来到的时候上一次运行到那里了呢?CPU又是怎么接着根据这个进程上一次运行的到的位置接着运行呢?所以当一个进程运行的时间片到了的时候,CPU因该将改进程运行后的信息进行记录起来,等到这个进程下一次再来的时候接着运行,而这些信息就是保存在寄存器里面的。但是这些信息最终不是放在寄存器中的,而是将信息重新放到进程的PCB中(这里我们就简单的理解是放到PCB中的,其实是更复杂的),等到下次再到CPU中运行的时候重新将数据个CPU,这个时候CPU就知道那些运行了,那些没有运行,而这个信息叫做进程的硬件上下文

  • 上面的保存硬件上下文的操作叫做保护上下文
  • 当一个进程第一次被运行那就正常执行,如果不是那么进程放到CPU中运行就得先将曾经保存的硬件上下文数据进行恢复

这里我们要明白的是:

  1. CPU内的寄存器只有一套,但是寄存器内保存的数据可以有多套。
  2. 虽然寄存器数据是放在一个共享的CPU设备里面呢,但是所有的数据其实都是被进程私有的。

也就是说,虽然我们的寄存器只有一套,但是只要进程来了,那么此时CPU中的寄存器存放的就是该进程的所数据,只要它走了,另一个进程来了,那么保存的就是该进程的数据。这样就体现出来进程的独立性。

3. 进程调度

Linux下实现进程调度的算法,是需要考虑优先级,饥饿问题,以及效率问题的。

之前我们只是简单的画出了进程调度的方式——运行队列。

在这里插入图片描述

现在我们来详细的解剖一下,这是一张运行队列中的详细成员:
在这里插入图片描述

上面大部分的属性现阶段都是不要太关系的,我们主要关系的是上面话红色框框的属性字段,和画蓝色框框的属性字段。

3.1运行队列实现优先级设计

在Linux下是通过queue[140]这个数组来控制优先级的,这个数组的下标就对应着优先级。

前面我们学习进程优先级的时候,我们说过了进程的优先级范围是[60,99]的一共有40个有限等级。那为什么这里控制优先级的数组是140呢?

首先这里的话我们只关系100 ~ 139,这部分叫做是普通优先级,100-139刚好对应着我们之前学习的进程的40个优先级。所以100对应着就是我们进程优先级的60,139就对应着99,剩下的0~99的部分称之为实时优先级

  • 分时操作系统必须以时间片为周期调度不同的进程,是为了确保公平,避免进程饥饿,比如现在的互联网,在互联网的视角中,所有用户都是公平的,不能因为谁的优先级高就仅服务谁,所有用户的优先级都差不太多,不会出现谁的优先级非常高的情况。
  • 还有另外一种为实时操作系统则相反,在运行某个进程时,必须跑完,严格按照队列先后顺序进行,如果有更高优先级的进程,允许插队,即实时操作系统必须对用户有高响应这一特性,比如车载系统,绝对不能使用基于时间片轮转的分时操作系统,而必须采用实时操作系统,刹车的指令优先级非常高,在用户需要刹车时他不会考虑音乐播放器进程会不会饥饿。
  • 所以我们必须保证一些进程实时尽快的被处理,所以也就有了实时优先级的概念,而0~99这些优先级就是为了这一部分而准备的。

而这个的原型其实是task_struct *queue[140]是一个指针数组,里面存放是处于同一优先级的进程的队列。所以就可以根据优先级插入对应的优先级队列中了。

在这里插入图片描述

通过上述我们可以得到40个优先级队列,那么拿到CPU运行的时候都是按照着40个优先级队列依次的遍历进行调度吗?拿到要遍历40次吗,因为着40个队列中大部分情况是不会每个都会有的,所以这必然会有不必要的操作,也会影响一点效率。

3.2 处理效率问题

所以为了防止把把40个队列中都进行遍历一次,在运行队列中的属性中有一个属性int bitmap[5],这是一个位图。所以在linux下其实时使用位图的方式来确定那些优先级里面是由进程在排队的。

int bitmap[5]有5个int类型的空间,也就是32 * 5 = 160个bit位,也就可以表示160个优先级了。所以bit位的位置就表示哪一个队列,哪一个优先级,bit位的内容就表示队列的内容。即1就表示有队列,0就表示没有队列。

所以我们检测队列中是否有进程,就是检测位图中的bit位是否位1。

而具体检测的过程就是先对int bitmap[5]中这5个元素通过int整形的方式来进行位位操作,一旦与一个整形进行位操作(比如用bitmap[0] & 0xFFFFFFF == 0,如果等于0就说明此时第一个整形位中是没有队列的,那么就去和第二个整形进行对比,一次类推)。而这种算法接近O(1)的算法了。

3.3 活动队列与过期队列

像上述的队列中,如果优先级更高的的队列中一直有进程进行插入的话,那么那些处于优先级比较低的进程就可能长时间的得不到CPU的调度,甚至是可能优先级特别低的进程将一直得不到调度,那么就会出现我们打开程序会出现一直打不开的情况,甚至是打都打不开。

所以Linux的设计者非常的聪明,他在原理的基础上(对应红色的框框)在次创建了一份同样的结构(对应着蓝色框框)所以说活动队列和过期队列是完全相同的一个结构,我们其实可以用一个结构体进行维护。

struct q
{int nr_active;bitmap[5];task_struct queue[140];
}然后过期队列和活动队列就是使用一下这种结构来表示
struct q array[2]

3.4 如何解决饥饿问题

有了活动队列和过期队列后,就有效的解决了上述的问题。

当CPU在执行活动队列中的进程的时候,后来的进程无论让的优先级有多高,他都不会在添加到后动队列中取了,而是添加到过期队列中去,并且一旦在活动队列中的进程在本才的时间片结束后也不会再次添加到当前的活动队列中去了,而是同样的添加到过期队列中去了。一旦活动队列中的进程都完成了后,这个时候我们的过期队列就变成了活动队列,活动队列就变成了过期队列。

3.5 active指针和expired指针

active指针永远指向活动队列,expired指针永远指向过期队列可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!

在这里插入图片描述
一开始struct q* active = &array[0], struct q* expried= &array[1]。

一旦检测到活动队列中中没有进程了,操作系统就会执行一个操作swap(&active, &expried),进而完成了活动队列和过期队列的交换。

相关文章:

【Linux】进程调度与切换

【Linux】进程调度与切换 1. 基本概念2. 进程切换3. 进程调度3.1运行队列实现优先级设计3.2 处理效率问题3.3 活动队列与过期队列3.4 如何解决饥饿问题3.5 active指针和expired指针 1. 基本概念 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个&am…...

SAM 2:分割图像和视频中的任何内容

文章目录 摘要1 引言2 相关工作3 任务:可提示视觉分割4 模型5 数据5.1 数据引擎5.2 SA-V数据集6 零样本实验6.1 视频任务6.1.1 提示视频分割6.1.2 半监督视频对象分割6.1.3 公平性评估6.2 图像任务7 与半监督VOS的最新技术的比较8 数据和模型消融8.1 数据消融8.2 模型架构消融…...

【免越狱】iOS任意版本号APP下载

下载地址 https://pan.quark.cn/s/570e928ee2c4 软件介绍 下载iOS旧版应用,简化繁琐的抓包流程。一键生成去更新IPA(手机安装后,去除App Store的更新检测)。 软件界面 使用方法 一、直接搜索方式 搜索APP,双击选…...

告别植物神经紊乱,这5种运动让你身心平衡,活力满满!‍♀️✨

Hey小伙伴们~👋 最近是不是感觉压力山大,晚上辗转反侧,白天又无精打采?😴😔 这可能是植物神经紊乱在悄悄作祟哦!别怕,今天就来给大家种草几个超有效的运动方式,帮你找回那…...

又一个iPhone时代开始

今年的苹果秋季发布会在昨晚召开了,今天早上我们也看到了很多相关的新闻。我猜你看完后的感觉可能是,这不过又是一次普普通通的参数升级。又是提升了百分之多少,又是增加了多少倍——非常简单的一些更新。比如说芯片升级了、相机的摄像头一会…...

在 CentOS 中永久关闭防火墙的步骤

在 CentOS 中永久关闭防火墙的步骤 在 CentOS 系统中,防火墙通常由 firewalld 服务管理。如果你希望在系统中永久关闭防火墙,可以按照以下步骤操作: 1. 停止防火墙服务 首先,你需要停止当前正在运行的防火墙服务。可以使用以下…...

【数据库】详解基本SQL语句用法

一、SELECTING DATA FROM TABLES【查询数据】 SELECT命令是表上所有查询的基础,因此给出它的完整描述以显示它的功能。在描述之后提供各种格式的示例。 1.1 整体描述 SELECT column1, column2, ... FROMtable1 [INNER | LEFT | RIGHT] JOIN table2 on conditions…...

R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据,这一类数据一般具有严重的空间异质性,而通常的统计学方法并不能处理空间异质性,因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法:经典地理加权回归,…...

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…...

JavaScript中的控制流语句:break、continue、return、throw

在JavaScript编程中,控制流语句是控制代码执行流程的重要工具。这些语句包括break、continue、return和throw,它们可以在循环、函数以及其他代码块中使用,以改变正常的执行顺序。下面我们将逐一探讨这些语句的用途和示例。 break break语句…...

移动通信为啥要用双极化天线?

❝本文简单介绍下移动通信为啥要用双极化天线及其简单概述。 移动通信为啥要用双极化天线? - RFASK射频问问❝本文简单介绍下移动通信为啥要用双极化天线及其简单概述。什么是极化?电磁波的极化通常是用其电场矢量的空间指向来描述:在空间某…...

C语言从头学59——学习头文件math.h(二)

继续学习头文件<math.h>&#xff0c;编号接续前文。 六、三角函数 math.h中的三角函数包括&#xff1a; acos()&#xff1a;反余弦&#xff0c;参数范围-1至1&#xff0c;返回值double类型&#xff1a;0~PI asin()&#xff1a;反正弦&#xff0c;参…...

Leetcode 3283. Maximum Number of Moves to Kill All Pawns

Leetcode 3283. Maximum Number of Moves to Kill All Pawns 1. 解题思路2. 代码实现 题目链接&#xff1a;3283. Maximum Number of Moves to Kill All Pawns 1. 解题思路 这一题坦率地说没有想到什么好的思路&#xff0c;因此只能非常暴力地按照题意进行了一下构造。 显然…...

智能物流新“黑神话”:各位“天命人”,这份行业应用锦集请收下!

全球工业革新浪潮中&#xff0c;智能物流正成为制造业转型升级的核心驱动力之一。高柔性的智能物流解决方案可以帮助企业应对复杂的物流挑战&#xff0c;实现生产到仓储全过程的智能化、柔性化和高度集成&#xff0c;带来显著的经济效益。 作为行业领先的全场景柔性物流综合解…...

SpringSecurity原理解析(五):HttpSecurity 类处理流程

1、SpringSecurity 在spring boot中与SSM项目中基于配置文件的区别 通过前边的笔记我们可以知道&#xff0c;在传统的SSM项目中 SpringSecurity的使用是基于配置文件 的&#xff0c;然后spring 容器初始化的时候将 SpringSecurity 中的各种标签解析成对应的Bean对象&#xff0c…...

C++系列-匿名对象

匿名对象 &#x1f4a2;什么是匿名对象&#x1f4a2;匿名对象的创建方式及作用域&#x1f4a2;匿名对象的对象类型&#x1f4a2;&#x1f4a2;匿名的基本数据类型对象&#x1f4a2;&#x1f4a2;匿名的自定义的类类型对象&#x1f4a2;&#x1f4a2;匿名的标准库的类对象 &…...

tofixed和math.round什么区别

1、floor 返回不大于的最大整数&#xff08;向下取整&#xff09; 2、round 则是4舍5入的计算&#xff0c;入的时候是到大于它的整数&#xff08;当-1.5时可见&#xff0c;四舍五入后得到的结果不是我们期待的&#xff0c;解决办法是先对他取绝对值&#xff0c;然后在用round方…...

OPENAIGC开发者大赛高校组金奖 | 基于混合大语言模型与多模态的全过程通用AI Agent

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给您…...

MySql批量迁移数据库

导出数据库 将指定数据库实例&#xff08;MYSQL_HOST、MYSQL_PORT、MYSQL_USER、MYSQL_PASSWORD&#xff09;中的所有数据库&#xff08;表结构、数据&#xff09;导出到指定目录&#xff08;BACKUP_DIR&#xff09;下的多个单独的SQL脚本&#xff0c;每个SQL脚本名称即为数据…...

一、selenium自动化简介selenium工具集

文章目录 一、简介二、组成部分三、selenium工具集3.1 Selenium IDE3.2 Selenium WebDriver3.3 Selenium Grid3.4 Appium 一、简介 官方网站 Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。 它提供了扩展来模拟用户与浏览器的交互&#xff0c;用于扩展浏览器分…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

Python爬虫(四):PyQuery 框架

PyQuery 框架详解与对比 BeautifulSoup 第一部分&#xff1a;PyQuery 框架介绍 1. PyQuery 是什么&#xff1f; PyQuery 是一个 Python 的 HTML/XML 解析库&#xff0c;它采用了 jQuery 的语法风格&#xff0c;让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...