【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

发布时间 - 2025-06-19 00:00:00    点击率:
  1. 进程优先级:

    1.2. 进程优先级的定义是什么?

    进程优先级指的是CPU资源分配的先后顺序,即进程的优先权(priority)。

    1.3. 为何存在进程优先级的概念?

    根本原因在于资源的稀缺性。

    在Linux环境中,默认优先级为80,且Linux的优先级是可调的,范围在【60,99】之间,共有40个级别。

    Linux优先级的本质是数字,数字越小,优先级越高!

    Linux系统允许用户调整优先级,但不能直接修改pri,而是通过修改nice值(不是优先级,而是进程优先级的修正数据)来实现。

    pri = pri(old) + nice

    1.4. 为什么Linux调整优先级需要受限制?

    如果不加限制,用户可以将自己进程的优先级设得极高,而将他人的优先级设得极低,高优先级的进程会优先获得资源,导致后续产生的进程难以享受到CPU资源,从而引发进程饥饿问题。

    1.5. PRI与NICE的区别需要特别强调的是什么?

    进程的nice值不是进程的优先级,它们是不同的概念,但nice值会影响进程优先级的变化。可以将nice值理解为进程优先级的修正数据。

    在Linux下,调整进程优先级就是调整进程的nice值,nice值的范围是-20至19,共有40个级别。

    使用top命令更改已存在进程的nice值:进入top后按“r”->输入进程PID->输入nice值。

  2. Linux的调度与切换:

    2.1. 概念准备:

    1. 进程在运行时,是否必须在CPU上运行完整个代码?

      不是!现代操作系统是基于时间片进行轮转执行的(时间片:给每个进程规定的最大运行时间)。

    2. 进程的竞争性、独立性、并行性和并发性:

      竞争性:系统中进程数量众多,而CPU资源有限,进程之间具有竞争属性。为了高效完成任务和合理竞争资源,便有了优先级。

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

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

      并发:多个进程在一个CPU下通过进程切换,在一段时间内让多个进程都得以推进,称之为并发。

    2.2. 如何完成进程的调度和切换?

    当一个进程的时间片到期后,如何保存进程以便下次调用?

    CPU内部有许多寄存器,进程在运行过程中会产生大量临时数据,存放在CPU的寄存器中。这些CPU内部的临时数据称为进程的硬件上下文。通过硬件上下文的保存,进程可以被再次调度时恢复运行。

    因此,当进程再次被调度时,将之前保存的硬件上下文恢复,使进程继续从上次运行的位置进行。

    上下文并不是寄存器,而是寄存器的内容。CPU的寄存器只有一套,但寄存器内部保存的数据可以有多套。

    所以,寄存器 ≠ 寄存器的内容。

    虽然寄存器数据放在共享的CPU设备中,但所有数据实际上是进程私有的。

    小结:所有的保存都是为了最终的恢复,所有的恢复都是为了继续上次的运行位置继续进行。


    2.4 Linux实现进程调度的算法需要考虑哪些因素?

    Linux实现进程调度的算法需要考虑优先级、进程饥饿问题和效率问题。

    解决优先级问题:

    普通优先级:100~139(对应nice值的取值范围)

    实时优先级:0~99(不关心)

    时间片未结束的所有进程都按优先级放在队列中。nr_active表示总共有多少个运行状态的进程,queue[140]表示一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,数组下标即优先级。

    从0下标开始遍历queue[140],找到第一个非空队列,该队列必定是优先级最高的队列。选中队列的第一个进程开始运行,调度完成,优先级问题解决。

    解决进程饥饿问题:

    采用引入活动队列和过期队列来解决。

    过期队列和活动队列结构相同,过期队列上放置的是时间片耗尽的进程。当活动队列上的进程都被处理完毕后,对过期队列的进程进行时间片重新计算。

    我们先将活动队列中的进程都运行完毕,注意活动队列上的进程运行完毕后会减少,不会增加,而过期队列里的进程只会越来越多。此时需要将活动队列的内容与过期队列的内容进行交换。

    交换方式:有两个指针分别指向活动队列和过期队列,active指针永远指向活动队列,expired指针永远指向过期队列。活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直存在。只要在合适的时候交换active指针和expired指针的内容,就相当于获得了一批新的活动进程。注意交换时只是交换指针的内容。

    解决效率问题:

    遍历queue[140]的时间复杂度是常数,但仍然不够高效。

    于是采用位图方法解决:

    bitmap[5]:一共140个优先级,一共140个进程队列。为了提高查找非空队列的效率,可以用5*32个比特位表示队列是否为空。我们每次可以先遍历一个整数,如果这个整数是0,就可以直接跳过,到下一个整数,直到发现不等于0,再遍历内部。

    位图将对数组的遍历转化为对比特位的遍历,效率会高很多。


# linux  # 操作系统  # 区别  # 为什么  # red  # 指针  # 并发  # 算法  # 遍历  # 多个  # 放在  # 的是  # 都是  # 第一个  # 称之为  # 可调  # 可以用  # 时间内 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  php 三元运算符实例详细介绍  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何用景安虚拟主机手机版绑定域名建站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  如何在云指建站中生成FTP站点?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  详解jQuery中的事件  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何快速搭建高效WAP手机网站?  香港服务器租用每月最低只需15元?  如何在万网利用已有域名快速建站?  Laravel如何处理表单验证?(Requests代码示例)  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  php json中文编码为null的解决办法  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  EditPlus中的正则表达式实战(5)  如何在香港免费服务器上快速搭建网站?  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel如何配置任务调度?(Cron Job示例)  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Java解压缩zip - 解压缩多个文件或文件夹实例  Python函数文档自动校验_规范解析【教程】  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  开心动漫网站制作软件下载,十分开心动画为何停播?  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在万网主机上快速搭建网站?  如何在阿里云服务器自主搭建网站?  如何批量查询域名的建站时间记录?  如何在橙子建站上传落地页?操作指南详解  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  香港网站服务器数量如何影响SEO优化效果?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  如何用低价快速搭建高质量网站?  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何快速搭建高效服务器建站系统?  创业网站制作流程,创业网站可靠吗?  iOS UIView常见属性方法小结  Laravel distinct去重查询_Laravel Eloquent去重方法