在Linux系统中,进程优先级和进程切换是进程管理的核心概念,直接影响系统的调度行为和性能。以下是详细说明:
一、进程优先级
Linux通过优先级决定进程获取CPU资源的顺序,分为两种类型:
1. 静态优先级(Nice值)
- 范围:-20(最高)到 19(最低),默认值为 0。
- 作用:用户可通过nice或renice命令调整进程的Nice值,间接影响调度权重。
- 命令示例:
启动时设置Nice值为-5
nice -n -5 ./script.sh修改已运行进程(PID=1234)的Nice值为10
renice -n 10 -p 12342.动态优先级(实时优先级)
范围:0(最低)到 99(最高),仅适用于实时调度策略(SCHED_FIFO/SCHED_RR)。
调度策略:
SCHED_FIFO:先进先出,高优先级进程独占CPU直到退出或阻塞。
SCHED_RR:时间片轮转,同优先级进程轮流执行。
SCHED_OTHER:默认的CFS(完全公平调度器)策略,适用于普通进程。
命令示例:
chrt -f -p 99 1234 # 设置PID=1234的进程为SCHED_FIFO,优先级99chrt -r -p 50 5678 # 设置PID=5678的进程为SCHED_RR,优先级50
3. 查看优先级
ps -eo pid,ni,pri,rtprio,cmd # 列出现场Nice值(NI)、动态优先级(PRI)、实时优先级(RTPRIO)top -p 1234 # 查看特定进程的优先级
二、进程切换(Context Switching)
进程切换是CPU从一个进程转到另一个进程的过程,涉及以下步骤:
1.触发条件
- 时间片耗尽:CFS调度器基于虚拟时间分配CPU,时间片用完触发切换。
- 主动放弃CPU:进程调用sleep()、yield()或等待I/O时。
- 高优先级抢占:更高优先级进程(如实时进程)就绪时。
- 中断处理:硬件中断可能导致内核态切换。
2.切换步骤
保存上下文:将当前进程的寄存器状态(PC、SP等)保存到其PCB(进程控制块)中。
选择新进程:调度器从就绪队列选取优先级最高的进程。
恢复上下文:加载新进程的寄存器状态,切换地址空间(MMU)。
切换内核栈:更新内核栈指针至新进程的内核栈。
3.性能影响
- 开销:每次切换需约微秒级时间,频繁切换(如高并发场景)可能导致性能下降。
- 监控工具:
vmstat 1 # 查看cs(context switch)列pidstat -w -p 1234 1 # 监控特定进程的上下文切换次数perf stat -e context-switches ./program # 统计程序切换次数