【Linux系统编程】—— 深入理解Linux进程优先级与调度机制
发布时间 - 2025-04-17 00:00:00 点击率:次进程优先级的基本概念
在linux系统中,进程优先级(priority)决定了进程执行的顺序。优先级较高的进程优先获得cpu资源,从而提高了执行的优先权。优先级值越低,进程的优先级越高,这意味着该进程更有可能被cpu优先执行。合理配置进程的优先级对于提升系统的整体性能至关重要。
此外,Linux还提供了将进程运行到指定CPU的功能。通过将不重要的进程分配到特定的CPU上,可以更有效地利用CPU资源,避免系统性能下降。
如何查看系统进程
在Linux或Unix系统中,我们可以使用ps -l命令来查看当前运行的进程。输出信息中包含了多个有用的字段,帮助我们理解每个进程的状态。以下是一些重要字段:
- UID:表示进程的执行者身份。
- PID:代表进程的标识符。
- PPID:表示该进程的父进程ID。
- PRI:进程的优先级。值越小,优先级越高。
- NI:进程的nice值,影响进程的优先级。
PRI和NI:优先级与Nice值
PRI(Priority)是进程的优先级,其值越小,优先级越高,进程越有可能先执行。NI(Nice)是进程的优先级修正值,可以调整进程的优先级。通过修改nice值,用户可以间接地影响进程的PRI值。
具体地,进程的新PRI值计算公式为:
PRI(new) = PRI(old) + nice
当nice值为负时,进程的优先级会变小(优先级提升);当nice值为正时,进程的优先级会变大(优先级降低)。nice值的范围是-20到19(PRI的值为0~99),越小表示优先级越高,越大表示优先级越低。
查看和调整进程优先级
在Linux中,查看进程优先级的常用命令是top。通过top命令,我们不仅能够查看各个进程的优先级,还能实时调整进程的nice值:
- 输入
top命令启动进程监视。 - 按
r键,选择需要调整的进程PID。 - 输入新的nice值来调整该进程的优先级。
除了top命令外,Linux还提供了nice和renice命令来分别调整进程的初始优先级和修改已经运行中的进程的优先级。
补充概念-竞争、独立、并行、并发
- 竞争性:系统进程数量众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
- 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
- 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。
- 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
进程切换
CPU上下文切换:其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中,入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器,并开始下一个任务的运行,这一过程就是context switch。
时间片:当代计算机都是分时操作系统,每个进程都有它合适的时间片(其实就是一个计数器)。时间片到达,进程就被操作系统从CPU中剥离下来。
Linux2.6内核进程O(1)调度队列
上图是Linux2.6内核中进程队列的数据结构,之间关系也已经给大家画出来,方便大家理解。
- 一个CPU拥有一个runqueue,如果有多个CPU就要考虑进程个数的负载均衡问题。
- 优先级:
- 普通优先级:100〜139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
- 实时优先级:0〜99(不关心)
活动队列及其优化
在操作系统的进程调度中,活动队列(Active Queue)用于管理处于运行状态的进程。活动队列不仅管理进程的排队顺序,还涉及进程的优先级和调度策略。以下是活动队列的关键概念及其优化过程的整理:
活动队列的基本概念
- nr_active:表示当前活动队列中处于运行状态的进程总数。它用于记录系统中所有正在运行的进程数量。
- queue[140]:这是一个数组,其中每个元素对应一个优先级队列。进程按照优先级排队,相同优先级的进程使用先进先出(FIFO)规则进行调度。数组下标代表进程的优先级,因此queue[0]表示优先级最高的进程队列,queue[139]表示优先级最低的进程队列。
进程调度的基本过程
操作系统根据活动队列进行进程调度的过程如下:
- 遍历队列:从queue[0]开始遍历,查找非空的进程队列。
- 选择最高优先级的进程队列:找到第一个非空队列,该队列中的进程具有最高的优先级。
- 选中并执行进程:从该非空队列中选择第一个进程进行调度执行。
- 调度完成:该进程开始执行,调度过程结束。
该过程的时间复杂度通常为常数时间,因为队列的遍历通常是有限的,但存在低效的情况。
低效问题及优化方案
直接遍历queue[140]来查找非空队列存在效率问题,尤其在系统中进程数量较多时,这种遍历方式会变得低效。为了提高查找非空队列的效率,可以通过使用位图(bitmap)进行优化:
- bitmap[5]:为了提高查找非空队列的效率,可以使用位图来标识每个进程队列是否为空。此位图有140个位置,表示140个进程队列,每个位置使用5个字节(5 * 32位),每一位表示相应队列的空闲状态。
- 优化效果:通过位图的使用,可以在常数时间内快速定位到第一个非空队列,从而大大提高查找和调度的效率。
过期队列
过期队列和活动队列结构一模一样。过期队列上放置的进程,都是时间片耗尽的进程。当活动队列上的进程都被处理完毕之后,对过期队列的进程
进行时间片重新计算。
过期队列与活动队列的结构
过期队列和活动队列在结构上非常相似,都是由一个队列组成,用于管理不同优先级的进程。其基本结构如下:
- 过期队列:这是放置已经超时或者不再需要立即执行的进程队列。系统会根据进程的优先级来调度这些进程,通常只有在特定的条件下,才会将这些进程重新激活。
- 活动队列:这个队列用于管理当前需要执行的进程。处于活动队列中的进程会按照优先级顺序执行,直至完成。
过期队列和活动队列的关键点:
当活动队列中的进程被处理完毕后,系统会重新计算过期队列中进程的时间片,并重新将其加入活动队列,等待重新执行。
active指针与expired指针
在操作系统中,active和expired指针用于指向活动队列和过期队列的内容。具体作用如下:
- active指针:该指针始终指向活动队列,管理当前需要执行的进程。当队列中有进程时,active指针指向活动队列的第一个进程,系统从该进程开始调度。
- expired指针:与active指针类似,expired指针指向过期队列。过期队列存储的是已超时的进程,等待重新激活并加入活动队列进行调度。
尽管active和expired指针指向的是两个不同的队列,但它们之间的转换并没有特别复杂的关联。当一个进程的执行时间片结束后,系统会将其从活动队列移到过期队列。当过期队列中的进程恢复执行时,它们会再次被移动到活动队列。
# linux
# 操作系统
# switch
# red
# 标识符
# 指针
# 数据结构
# 栈
# 堆
# 并发
# unix
# 负载均衡
# 多个
# 遍历
# 都是
# 越高
# 第一个
# 的是
# 值为
# 越小
# 将其
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何挑选优质建站一级代理提升网站排名?
公司门户网站制作流程,华为官网怎么做?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
网站制作软件免费下载安装,有哪些免费下载的软件网站?
文字头像制作网站推荐软件,醒图能自动配文字吗?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何与Inertia.js和Vue/React构建现代单页应用
北京网站制作公司哪家好一点,北京租房网站有哪些?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何使用Blade模板引擎?(完整语法和示例)
详解阿里云nginx服务器多站点的配置
进行网站优化必须要坚持的四大原则
如何获取PHP WAP自助建站系统源码?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何用y主机助手快速搭建网站?
如何在 Pandas 中基于一列条件计算另一列的分组均值
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
LinuxCD持续部署教程_自动发布与回滚机制
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何配置任务调度?(Cron Job示例)
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何利用DOS批处理实现定时关机操作详解
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
如何在腾讯云服务器快速搭建个人网站?
如何在腾讯云服务器上快速搭建个人网站?
Android仿QQ列表左滑删除操作
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel怎么使用artisan命令缓存配置和视图
JavaScript常见的五种数组去重的方式
php json中文编码为null的解决办法
Python文件操作最佳实践_稳定性说明【指导】
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel如何实现用户密码重置功能?(完整流程代码)
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层

