【Linux】探索进程优先级的奥秘,解锁进程的调度与切换
发布时间 - 2025-06-19 00:00:00 点击率:次-
进程优先级:
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值。
-
Linux的调度与切换:
2.1. 概念准备:
-
进程在运行时,是否必须在CPU上运行完整个代码?
不是!现代操作系统是基于时间片进行轮转执行的(时间片:给每个进程规定的最大运行时间)。
-
进程的竞争性、独立性、并行性和并发性:
竞争性:系统中进程数量众多,而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去重方法


数是0,就可以直接跳过,到下一个整数,直到发现不等于0,再遍历内部。