欢迎光临
我们一直在努力

【Linux】 进程(6)进程优先级与进程切换


   Linux进程优先级与进程切换:调度背后的核心原理   

一、进程优先级基础概念

        进程优先级,简单来说就是CPU分配时间片的先后权重。优先级越高,进程越容易被调度器选中,获取更多CPU执行机会。

        Linux系统有一条关键规则:优先级的数值越小,代表优先级越高。

        注意:优先级只改变CPU调度顺序,和文件权限、访问权限没有任何关系。

操作系统为什么需要优先级?

         CPU属于稀缺资源,当大量进程同时就绪竞争CPU,内核调度器不能完全“平均分配”。通过优先级机制,可以保障交互类进程(终端、桌面)优先响应,后台备份、压缩任务适当谦让,兼顾系统响应速度与整体吞吐量。


1.1 PRI 和 NI(Nice)

很多人会混淆PRI与Nice值,这是面试最常挖坑的地方。

  • PRI(Priority):内核真正使用的调度优先级。 由Linux内核动态计算维护,用户不能直接修改PRI。普通用户进程PRI范围100~139,数值越小优先级越高。
  • NI(Nice)谦让值:用户可以修改的偏移修正量。 Nice翻译为“谦让”,代表进程有多愿意把CPU让给其他进程。 取值范围: – 20 ~ 19 
  • -20:最高谦让等级,进程抢占能力最强
  • 19:最低谦让等级,最大限度把CPU让给别人

权限限制:

  • root用户:可以设置 nice -20 ~19,既可以调高自己进程优先级,也可以调低。
  • 普通用户:仅允许设置 0~19,只能让进程变“谦让”,不能提升进程优先级,防止普通进程抢占系统关键任务。
  •         二者计算公式: 新PRI = 旧PRI + Nice

    ⚠️重要误区:不要以为修改Nice=-20,PRI就固定等于80‑20。Nice仅仅是偏移量,PRI是内核综合多种因素动态算出,nice只能间接影响,不能完全锁定PRI的值。

    对比项PRINI(Nice值)
    本质 内核实际调度优先级 用户可控的偏移修正值
    维护方 Linux内核动态计算 用户/管理员手动修改
    能否直接修改 ❌不可直接修改 ✅可修改
    取值范围 普通进程100‑139 -20 ~ +19
    关系 调度器真正看PRI做决策 通过NI间接改变PRI

    1.2 查看&修改优先级实战命令

  • ps -l:静态快照查看进程PRI、NI
  • ps -l

            输出可以直接看到PRI、NI两列。

  • top:动态实时监控进程状态,实时刷新优先级。
  • nice:进程启动的时候设置nice值
  • #启动备份脚本,设置nice=19,尽量少抢占CPU
    nice -n 19 ./backup.sh

  • renice:修改已经正在运行进程的nice值
  • #将PID为2345的进程nice设置为5
    renice -n 5 -p 2345

    生产场景:

            对于数据备份、日志压缩这类CPU密集但对时延不敏感的后台任务,调高nice值,避免抢占业务进程CPU资源。


    二、基础概念辨析:竞争、独立、并发、并行

    这四个概念是理解多进程模型的基石,面试经常要求口述区分。

    竞争  

            多个进程抢夺有限的系统资源,CPU、内存、IO都属于竞争资源。一颗CPU核心同一时刻只能运行一个进程,进程之间天然存在CPU竞争。


    独立性

            进程是操作系统资源分配最小单位。每个进程拥有独立虚拟地址空间、PCB进程控制块、独立文件描述符表。 进程之间相互隔离,一个进程崩溃,默认情况下不会直接导致其他进程崩溃。

            补充:独立性不是绝对,共享内存、消息队列等IPC机制可以打破隔离,实现进程通信。


    并发(Concurrency)

            单核CPU就可以实现并发。 宏观一段时间内,多个任务都得到推进;微观同一个CPU核心,同一时刻只有一个进程在运行。依靠CPU时间片快速切换,制造出“多个程序同时跑”的效果。简单理解:人少活多,来回切换干活。


    并行(Parallelism)        

             必须依赖多个CPU物理核心。在同一个时间点,多个进程真正在不同CPU核心上同时执行。微观、宏观都是同时运行。简单理解:人手充足,多人同时干活。


    面试一句话记忆:

            并发是交替执行,单核即可;并行是真正同时执行,必须多核。

            并发不一定等于并行。

    概念硬件条件同一时刻执行状态
    并发 单核/多核都支持 单核心上进程交替执行
    并行 必须多核CPU 多个CPU核心真正同时运行进程

    三、进程切换 —— 上下文切换

            当内核调度器决定停止当前进程,让另外一个进程占用CPU,这个动作就叫进程切换,也就是上下文切换 Context Switch。

    3.1 触发进程切换的时机

  • 当前进程的CPU时间片耗尽
  • 就绪队列出现优先级更高的进程;
  • 进程主动阻塞:调用sleep、等待IO,主动让出CPU。

  • 3.2 什么是上下文?

    上下文就是进程的运行现场环境,主要分为三部分:

  • 硬件上下文:CPU各个寄存器(程序计数器PC、栈指针SP、通用寄存器集合),保存进程执行到哪一步。
  • 用户上下文:进程虚拟地址空间,代码段、数据段、用户栈。
  • 内核上下文:进程对应的内核栈、PCB任务结构体。

  • 3.3 一次完整进程切换流程

  • 保存现场:把当前正在运行进程A所有寄存器、运行状态保存到A的PCB与内核栈;
  • 切换地址空间:修改MMU页表,切换为下一个进程B的虚拟‑物理内存映射,完成进程地址空间切换;
  • 恢复现场:从进程B的PCB中读取保存的寄存器,加载到CPU寄存器;
  • CPU从进程B上次被打断的位置继续向下执行。
  • Linux内核关键源码路径:__schedule()调度入口,调用context_switch(),最终由汇编switch_to()完成寄存器切换。


    3.4 上下文切换的开销(面试重点)

    上下文切换不是无代价,频繁大量切换会消耗CPU,降低系统整体吞吐量:

  • 寄存器读写、栈现场保存恢复带来CPU运算开销;
  • 切换进程页表,会造成CPU的TLB缓存失效,内存访问速度大幅下降;
  • 需要执行大量内核代码,占用CPU周期。
  • 排查工具:vmstat,输出中cs列代表每秒上下文切换次数,如果cs数值持续很高,说明系统进程切换过于频繁,需要排查业务。

    进程切换 VS 线程切换

    • 进程切换:需要切换页表,TLB失效,开销大;
    • 同一进程下多线程切换:线程共享同一个虚拟地址空间,不需要切换页表,TLB不用刷新,切换开销小很多。

    四、面试高频考点汇总

  • PRI和Nice(NI)的区别?能不能直接修改PRI?

    PRI是内核真正调度使用优先级,用户不能直接修改;

    Nice是用户可以修改的偏移量,只能间接改变PRI。

  • Nice的取值范围,root用户与普通用户权限差异?

    范围‑20~19;root可以设置全部区间,普通用户只能设置0‑19,只能让进程谦让,不能调高优先级。

  • nice与renice命令区别?

    nice:进程启动时设置nice;

    renice:修改已经运行进程的nice。

  • 并发和并行区别,单核CPU可以做到并行吗?

    并发是交替运行,单核就可以;并行需要多核硬件,单核CPU无法实现并行。

  • 什么是上下文切换?开销来自哪里?

    调度器换下当前进程、运行新进程,需要保存恢复进程运行现场;

    开销来自寄存器保存恢复、TLB缓存失效、内核代码执行。

  • 什么场景触发进程切换?

    时间片耗尽、高优先级进程就绪、进程阻塞等待资源主动放弃CPU。

  • 线程切换为什么比进程切换快?

    同进程线程共享地址空间,不需要切换页表,不会造成TLB失效。


  • 小结

  • Nice(NI)只是偏移,真正决定调度的是内核维护的PRI;
  • 并发靠时间片交替,并行依靠多核硬件,二者不要混淆;
  • 上下文切换有性能损耗,过高的cs是系统性能隐患;
  • 优先级不会强制霸占CPU,只是改变被调度到的概率,Linux普通进程采用CFS完全公平调度。


  • 赞(0)
    未经允许不得转载:171主机测评 » 【Linux】 进程(6)进程优先级与进程切换
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址