在 Linux 中,区分普通进程(Normal Process)和实时进程(Real-Time Process)主要通过以下两个核心机制实现:
1. 调度策略(Scheduling Policy)
Linux 使用 调度策略明确标识进程类型:
- 普通进程:
- 调度策略:`SCHED_OTHER`(或 `SCHED_NORMAL`)
- 特点:使用 **完全公平调度器(CFS)** 分配 CPU 时间,优先级由 `nice` 值(范围 `-20` 到 `19`)动态调整。
- 实时进程:
- 调度策略分为两类:
- `SCHED_FIFO`:先进先出,高优先级进程独占 CPU 直至退出。
- `SCHED_RR`:时间片轮转,同优先级进程轮流执行。
- 特点:优先级固定(**实时优先级**),范围 `1`(最低)到 `99`(最高),**始终优先于普通进程**。
---
2. 实时优先级(Real-Time Priority)
- **普通进程**:
实时优先级固定为 **`0`**(通过系统调用或工具查看时显示为 `0` 或 `-`)。
- **实时进程**:
实时优先级范围 **`1–99`**(数值越大优先级越高),由用户显式设置。
---
如何检查进程类型
方法 1:使用 `ps` 命令
```bash
ps -eo pid,comm,policy,rtprio
```
- **关键列**:
- `POLICY`:调度策略标识符:
- `TS` → `SCHED_OTHER`(普通进程)
- `FF` → `SCHED_FIFO`(实时进程)
- `RR` → `SCHED_RR`(实时进程)
- `RTPRIO`:实时优先级:
- `-` 或 `0` → 普通进程
- `1-99` → 实时进程
**示例输出**:
```
PID COMMAND POLICY RTPRIO
1 systemd TS -
123 my_rt_app RR 99 # 实时进程(RR策略,优先级99)
456 bash TS - # 普通进程
```
---
方法 2:使用 `chrt` 命令
```bash
chrt -p <PID>
```
**输出示例**:
```bash
# 普通进程
pid 456's current scheduling policy: SCHED_OTHER
pid 456's current scheduling priority: 0
# 实时进程
pid 123's current scheduling policy: SCHED_RR
pid 123's current scheduling priority: 99
```
注意事项
1. **权限要求**:
设置实时进程需 `CAP_SYS_NICE` 能力(通常需 `root` 权限),避免低权限用户创建实时进程导致系统不稳定。
2. **系统稳定性**:
错误配置高优先级 `SCHED_FIFO` 进程可能使系统无响应(需谨慎使用)。
3. **混合调度**:
Linux 调度器始终优先执行实时进程,仅在无实时任务时调度普通进程。
通过调度策略和优先级,Linux 内核明确区分并管理两类进程,确保实时任务获得确定性响应。