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

【Linux】为什么死循环卡不死 Linux?3 个核心逻辑看懂进程优先级与 CPU 调度密码

前言:欢迎各位光临本博客,这里小编带你直接手撕Make/Makefile (自动化构建),文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!!

解释_chmod_命令_(3).gif

**🔥个人主页:IF’Maxue-CSDN博客

🎬作者简介:C++研发方向学习者

📖**个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》
**

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行!

文章目录

    • 1. 先搞懂:进程优先级到底是啥?
    • 2. 为啥要有优先级?CPU不够用了!
    • 3. 实操:怎么看/改优先级?
      • 3.1 查看优先级:用top命令
      • 3.2 改正在运行的进程优先级(top命令内操作)
      • 3.3 启动时指定优先级:用nice命令
      • 3.4 注意:优先级不能乱改!
    • 4. 必懂概念:进程的“关系”与“切换”
      • 4.1 4个关键概念:竞争、独立、并行、并发
      • 4.2 进程切换:为啥死循环程序不会卡死系统?
    • 5. 再深入:优先级的本质与文件权限
      • 5.1 优先级的本质:一个整数
      • 5.2 进程为啥能访问文件?看“身份”
      • 5.3 核心原则:时间片与公平性
    • 6. Linux调度算法:怎么快速选进程?
      • 6.1 两种操作系统:分时 vs 实时
      • 6.2 运行队列:140个“格子”
      • 6.3 快速找进程:bitmap位图
      • 6.4 解决“饥饿”:活跃与过期队列
    • 最后总结

1. 先搞懂:进程优先级到底是啥?

简单说,进程优先级就是“谁先用CPU”的排队顺序
就像奶茶店点单,加急单(高优先级)比普通单(低优先级)先做,CPU也会优先给高优先级进程分配资源。

  • image.png

2. 为啥要有优先级?CPU不够用了!

电脑里同时跑着微信、浏览器、后台服务等几十上百个进程,但CPU核心就那么几个(比如4核、8核),资源不够分,必须定个“规矩”——这就是优先级的意义。

这里要分清两个容易混的概念:

  • 优先级:有资格用资源,只是“先到后到”(比如都能结账,VIP先结)
  • 权限:有没有资格用资源(比如普通用户不能删系统文件,相当于没资格进“系统文件结账区”)

Linux里用两个值描述优先级:

  • PRI:基础优先级,所有进程默认都是80
  • NI(nice值):优先级修正值(可以调,但不建议乱改!)
    进程真实优先级 = PRI + NI(比如PRI=80,NI=-10,真实优先级就是70,比默认高)
  • image.png

3. 实操:怎么看/改优先级?

3.1 查看优先级:用top命令

在终端输入 top,会显示所有进程的状态,其中:

  • PR 列:真实优先级
  • NI 列:nice值

3.2 改正在运行的进程优先级(top命令内操作)

  1. 输入 top 进入监控界面
  2. R 键(大写),提示“Enter PID to renice:”
  3. 输入进程ID(比如示例中的25110),回车
  4. 提示“Renice PID 25110 to value:”,输入要调整的NI值(比如我们改-10)
  • image.png

3.3 启动时指定优先级:用nice命令

如果想让程序启动时就带指定优先级,用 nice -n [NI值] 程序命令,比如:

# 以NI=5的优先级启动我的程序(真实优先级=80+5=85)
nice -n 5 ./my_application# 查看效果:用ps命令看NI列
ps -l ./my_application
  • image.png

3.4 注意:优先级不能乱改!

  • NI值范围被严格限制在 [-20, 19](-20优先级最高,19最低)
  • image.png
  • 大范围改优先级会打乱系统的“活跃队列”和“过期队列”,可能导致进程调度错误
  • image.png

4. 必懂概念:进程的“关系”与“切换”

4.1 4个关键概念:竞争、独立、并行、并发

  • 竞争:多个进程抢CPU/内存等资源
  • 独立:一个进程崩了不影响其他(比如浏览器崩了,微信还能聊)
  • 并行:多CPU同时跑多个进程(比如8核CPU同时跑8个程序)
  • 并发:1个CPU“轮流”跑多个进程(快速切换,看起来像同时跑)
  • image.png

4.2 进程切换:为啥死循环程序不会卡死系统?

你可能会问:如果一个程序死循环了,会一直占着CPU不放吗?不会!因为有“时间片”——每个进程最多用CPU一小会儿(比如10毫秒),到点就“换人”。

切换时要做两件事:

  1. 存数据:当前进程的临时数据(存在CPU寄存器里),要保存到进程的“档案袋”(内核里的 struct task_struct 结构体)
    • image.png
    • 简单说:寄存器是CPU的“小本本”,记临时数据;切换时要把“小本本”内容抄到“档案袋”里
  2. 读数据:从下一个进程的“档案袋”里,把数据读回CPU寄存器,让它继续跑
  • image.png
  • image.png

还有个关键:内核里有个 struct task_struct* current 指针,永远指向正在跑的进程,就像“当前值班人员名牌”。

  • image.png

5. 再深入:优先级的本质与文件权限

5.1 优先级的本质:一个整数

进程的优先级,其实是 struct task_struct 里的一个整数——值越低,优先级越高(比如70比80优先级高)。

  • image.png

5.2 进程为啥能访问文件?看“身份”

Linux里,所有资源访问都是“进程替用户干的”——进程的“身份”(用户ID、组ID)和文件的权限(所有者、所属组、其他用户)匹配,才能访问。

  • image.png

5.3 核心原则:时间片与公平性

现在的操作系统都是“时间片调度”,核心是公平——哪怕是低优先级进程,也不会永远没机会用CPU。

6. Linux调度算法:怎么快速选进程?

6.1 两种操作系统:分时 vs 实时

  • 分时系统:我们日常用的(Windows、Linux桌面版),多个程序轮流用CPU,保证公平
  • 实时系统:工业/关键场景用的(比如新能源汽车刹车系统),进程来了必须立刻跑,不能等
    大部分Linux系统两种模式都有,只是实时模式默认隐藏。

6.2 运行队列:140个“格子”

每个CPU对应一个“运行队列”(runqueue),里面有140个“格子”(队列),按优先级分:

  • 0~99号:实时进程(优先级高,必须立刻跑)
    • image.png
  • 100~139号:普通进程(我们日常用的程序)
    • image.png

这140个队列本质是个“哈希表”——按优先级把进程分到对应的格子里,找起来快。

  • image.png

6.3 快速找进程:bitmap位图

调度器怎么在140个格子里快速找到“有进程的最高优先级格子”?用bitmap(位图)

  • 每个格子对应一个“比特位”(0或1)
  • 比特位=1:这个格子有进程;比特位=0:没进程
  • 扫一遍位图,瞬间就能找到最高优先级的进程(这就是“O(1)调度算法”——不管多少进程,找的速度都一样快)
  • image.png

6.4 解决“饥饿”:活跃与过期队列

如果高优先级进程一直有,低优先级进程会不会“饿死”(永远没机会)?不会!调度器用了两个队列:

  • 活跃队列:当前能被调度的进程
  • 过期队列:用完时间片的进程

等活跃队列里的进程都跑过一轮,就执行 swap(&active, &expired)(交换两个队列的角色),让过期队列里的进程变成“活跃”,保证每个进程都有机会。

  • image.png
  • image.png
  • image.png

另外,Linux分时系统支持“内核优先级抢占”——如果来了更高优先级的进程,能立刻“打断”当前进程,保证高优先级任务及时执行。

最后总结

Linux进程调度的核心逻辑很简单:

  1. 用“优先级”定排队顺序,解决CPU不够用的问题;
  2. 用“时间片”和“活跃/过期队列”保证公平,不让进程“饿死”;
  3. 用“bitmap”和“140个队列”快速找进程,保证调度效率。

记住:日常用不用深扒内核,但知道“别乱改NI值”“死循环程序不会卡死系统”这些点,就能更好地管理Linux程序啦~

http://www.dtcms.com/a/364355.html

相关文章:

  • Langchain4j 整合MongoDB 实现会话持久化存储详解
  • 电表连网不用跑现场!耐达讯自动化RS485转Profinet网关 远程配置+技术支持,真能做到!
  • 单元测试数据库回滚问题
  • 如何在FastAPI中巧妙隔离依赖项,让单元测试不再头疼?
  • 10 分钟掌握 Selenium 8 大元素定位法:从踩坑到精通
  • Python分布式任务队列:万级节点集群的弹性调度实践
  • 深入剖析Spring Boot中Spring MVC的请求处理流程
  • 电脑接入企业中的网线,为啥网卡上面显示AD域名
  • 智能电视小米电视浏览器兼容性踩坑电视黑屏或者电视白屏,Vue项目从Axios到Fetch的避坑指南
  • 【Pytest】解决Pytest中Teardown钩子的TypeError:实例方法与类方法的调用差异
  • 腾讯Hunyuan-MT-7B翻译模型完全指南:2025年开源AI翻译的新标杆
  • 线性代数第一讲—向量组
  • 强化学习中的模仿学习是什么?
  • HR不会告诉你的秘密:学术简历中,这个内容会被秒标“高光“
  • 亚马逊云代理商:配置安全组规则步骤
  • 日志分析与安全数据上传脚本
  • 迅为RK3568开发板体验OpenHarmony—烧写镜像-安装驱动
  • 技术框架之脚手架实现
  • Trae x Vizro:低代码构建专业数据可视化仪表板的高效方案
  • HTML `<datalist>`:原生下拉搜索框,无需 JS 也能实现联想功能
  • kvm 虚拟机如何安装 qemu-guest-agent
  • C++ 面试高频考点 力扣 162. 寻找峰值 二分查找 题解 每日一题
  • C# Activator.GetObject 原理与示例:理解.NET Remoting远程调用
  • 前端学习 10-2 :验证中的SV
  • 时序数据库选型指南:为何Apache IoTDB成为工业物联网首选
  • 东土智建 | 让塔吊更聪明的“四大绝技”工地安全效率双升级
  • 亚马逊流量突围:如何用智能化关键词运营找到更多高转化机会?
  • InnoDB存储引擎-事务
  • 企业网络安全建设三阶段实战指南
  • 海康摄像头开发---JSON数据与图片分离