#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
int main() {
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(2, &mask); // 绑定到 CPU 核心 2
if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
perror("sched_setaffinity");
}
while (1) {
printf("Running on CPU 2\n");
sleep(1);
}
return 0;
}
# Makefile for compiling and testing cpu_affinity.c
CC = gcc
CFLAGS = -Wall -O2
TARGET = cpu_affinity
SRC = cpu_affinity.c
.PHONY: all clean run
all: $(TARGET)
$(TARGET): $(SRC)
$(CC) $(CFLAGS) -o $(TARGET) $(SRC)
run: $(TARGET)
@echo "Running $(TARGET)..."
@./$(TARGET)
clean:
rm -f $(TARGET)
make # 编译程序
make run # 运行程序
make clean # 清理生成文件
Running on CPU 2
Running on CPU 2
...
htop
按 F2 → “Display options” → 开启“Detail CPU time”,"Count CPUs from 0 instead of 1" -> F10 done
按 F2 → “Columns” → 开启“PROCESSOR”, 观察该进程是否固定在 CPU 2 -> F10 done
按 F3 -> Search : cpu_aff
可以看到cpu_affnitity 在CORE 2上 (从0开始)
htop
或者更简单一点用ps
pi@raspberrypi:~ $ ps -eo pid,psr,comm | grep cpu_affinity
2959 2 cpu_affinity
cat /proc/sys/kernel/sched_domain/cpu0/domain0/flags
这显示调度域的标志位,反映是否启用负载均衡、任务迁移等功能。
进阶:调度策略与优先级
Linux 支持多种调度策略:
策略 | 描述 |
---|---|
SCHED_OTHER | 默认 CFS 调度器,适合普通任务 |
SCHED_FIFO | 实时调度,先来先服务 |
SCHED_RR | 实时轮询调度 |
SCHED_BATCH | 批处理任务,低交互性 |
pi@raspberrypi:~/linux/smp_example $ cat /proc/sys/kernel/sched_domain/cpu0/domain0/flags 4143
echo "obase=2; 4143" | bc
1000000101111
以下是 Linux 内核中常见的调度域标志(来自 include/linux/sched/sd_flags.h
):
位位置 | 标志名 | 含义说明 |
---|---|---|
0 | SD_LOAD_BALANCE | 启用负载均衡机制 |
1 | SD_BALANCE_NEWIDLE | 在空闲时进行负载均衡 |
2 | SD_BALANCE_EXEC | 在任务执行时进行负载均衡 |
3 | SD_BALANCE_FORK | 在任务创建(fork)时进行负载均衡 |
4 | SD_WAKE_AFFINE | 唤醒任务时优先在本地 CPU |
5 | SD_ASYM_CPUCAPACITY | CPU 核心性能不对称(如 big.LITTLE) |
6 | SD_SHARE_CPUCAPACITY | 多核共享 CPU 能力 |
7 | SD_SHARE_PKG_RESOURCES | 多核共享封装资源(如缓存) |
8 | SD_SERIALIZE | 序列化负载均衡操作 |
9 | SD_ASYM_PACKING | 优先填满高性能核心 |
10 | SD_PREFER_SIBLING | 优先在兄弟核心调度任务 |
11 | SD_OVERLAP | 调度域之间有重叠 |
12 | SD_NUMA | NUMA 节点调度支持 |
解析 4143
对应的标志
二进制 1000000101111
表示以下标志被启用:
-
SD_LOAD_BALANCE
-
SD_BALANCE_NEWIDLE
-
SD_BALANCE_EXEC
-
SD_BALANCE_FORK
-
SD_WAKE_AFFINE
-
SD_PREFER_SIBLING
-
SD_OVERLAP
这些标志说明:
✅ 核心之间会进行自动负载均衡 ✅ 在任务创建、执行、空闲时都会尝试迁移任务 ✅ 优先在本地或兄弟核心唤醒任务 ✅ 支持调度域重叠(多个核心共享调度域)