CPU 亲核性

#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):

位位置标志名含义说明
0SD_LOAD_BALANCE启用负载均衡机制
1SD_BALANCE_NEWIDLE在空闲时进行负载均衡
2SD_BALANCE_EXEC在任务执行时进行负载均衡
3SD_BALANCE_FORK在任务创建(fork)时进行负载均衡
4SD_WAKE_AFFINE唤醒任务时优先在本地 CPU
5SD_ASYM_CPUCAPACITYCPU 核心性能不对称(如 big.LITTLE)
6SD_SHARE_CPUCAPACITY多核共享 CPU 能力
7SD_SHARE_PKG_RESOURCES多核共享封装资源(如缓存)
8SD_SERIALIZE序列化负载均衡操作
9SD_ASYM_PACKING优先填满高性能核心
10SD_PREFER_SIBLING优先在兄弟核心调度任务
11SD_OVERLAP调度域之间有重叠
12SD_NUMANUMA 节点调度支持

解析 4143 对应的标志

二进制 1000000101111 表示以下标志被启用:

  • SD_LOAD_BALANCE

  • SD_BALANCE_NEWIDLE

  • SD_BALANCE_EXEC

  • SD_BALANCE_FORK

  • SD_WAKE_AFFINE

  • SD_PREFER_SIBLING

  • SD_OVERLAP

这些标志说明:

✅ 核心之间会进行自动负载均衡 ✅ 在任务创建、执行、空闲时都会尝试迁移任务 ✅ 优先在本地或兄弟核心唤醒任务 ✅ 支持调度域重叠(多个核心共享调度域)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值