【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中运行就得先将曾经保存的硬件上下文数据进行恢复
这里我们要明白的是:
- CPU内的寄存器只有一套,但是寄存器内保存的数据可以有多套。
- 虽然寄存器数据是放在一个共享的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>,编号接续前文。 六、三角函数 math.h中的三角函数包括: acos():反余弦,参数范围-1至1,返回值double类型:0~PI asin():反正弦,参…...
Leetcode 3283. Maximum Number of Moves to Kill All Pawns
Leetcode 3283. Maximum Number of Moves to Kill All Pawns 1. 解题思路2. 代码实现 题目链接:3283. Maximum Number of Moves to Kill All Pawns 1. 解题思路 这一题坦率地说没有想到什么好的思路,因此只能非常暴力地按照题意进行了一下构造。 显然…...
智能物流新“黑神话”:各位“天命人”,这份行业应用锦集请收下!
全球工业革新浪潮中,智能物流正成为制造业转型升级的核心驱动力之一。高柔性的智能物流解决方案可以帮助企业应对复杂的物流挑战,实现生产到仓储全过程的智能化、柔性化和高度集成,带来显著的经济效益。 作为行业领先的全场景柔性物流综合解…...
SpringSecurity原理解析(五):HttpSecurity 类处理流程
1、SpringSecurity 在spring boot中与SSM项目中基于配置文件的区别 通过前边的笔记我们可以知道,在传统的SSM项目中 SpringSecurity的使用是基于配置文件 的,然后spring 容器初始化的时候将 SpringSecurity 中的各种标签解析成对应的Bean对象,…...
C++系列-匿名对象
匿名对象 💢什么是匿名对象💢匿名对象的创建方式及作用域💢匿名对象的对象类型💢💢匿名的基本数据类型对象💢💢匿名的自定义的类类型对象💢💢匿名的标准库的类对象 &…...
tofixed和math.round什么区别
1、floor 返回不大于的最大整数(向下取整) 2、round 则是4舍5入的计算,入的时候是到大于它的整数(当-1.5时可见,四舍五入后得到的结果不是我们期待的,解决办法是先对他取绝对值,然后在用round方…...
OPENAIGC开发者大赛高校组金奖 | 基于混合大语言模型与多模态的全过程通用AI Agent
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给您…...
MySql批量迁移数据库
导出数据库 将指定数据库实例(MYSQL_HOST、MYSQL_PORT、MYSQL_USER、MYSQL_PASSWORD)中的所有数据库(表结构、数据)导出到指定目录(BACKUP_DIR)下的多个单独的SQL脚本,每个SQL脚本名称即为数据…...
一、selenium自动化简介selenium工具集
文章目录 一、简介二、组成部分三、selenium工具集3.1 Selenium IDE3.2 Selenium WebDriver3.3 Selenium Grid3.4 Appium 一、简介 官方网站 Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。 它提供了扩展来模拟用户与浏览器的交互,用于扩展浏览器分…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
