首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 進程 CPU 親和性設定:taskset 指令與 sched_setaffinity 系統呼叫

     編輯:關於C語言

應用場景

生產者-消費者模型:生產者運算密集(需 1 核心),消費者 I/O 密集(需多核心),透過 CPU 親和性綁定核心提升效能。

指令列工具:taskset

# 查看程式 4321 當前親和性
taskset -p 4321

# 設定程式 4321 綁定核心 1,2,3
taskset -cp 1,2,3 4321

# 啟動程式並綁定核心 1,2,3-5
taskset -c 1,2,3-5 /usr/bin/myapp
  • -p:操作現有 PID
  • -c:以核心清單格式指定(支援範圍 3-5)

系統呼叫:sched_setaffinity / sched_getaffinity

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <unistd.h>

int set_cpu_affinity(int cpu_id) {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(cpu_id, &mask);
    
    if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
        perror("sched_setaffinity");
        return -1;
    }
    return 0;
}

int get_cpu_affinity() {
    cpu_set_t mask;
    if (sched_getaffinity(0, sizeof(mask), &mask) == -1) {
        perror("sched_getaffinity");
        return -1;
    }
    for (int i = 0; i < CPU_SETSIZE; i++) {
        if (CPU_ISSET(i, &mask)) printf("CPU %d ", i);
    }
    printf("\n");
    return 0;
}

關鍵資料結構:cpu_set_t

  • 位元遮罩,每位代表一個邏輯核心
  • CPU_ZERO 清零、CPU_SET 設位、CPU_ISSET 檢測
  • 子執行緒繼承父執行緒親和性,需在建立執行緒後個別設定

取得系統核心數

int num_cores = sysconf(_SC_NPROCESSORS_CONF);
printf("系統邏輯核心數: %d\n", num_cores);

注意事項

  • 需要 CAP_SYS_NICE 權限(通常 root 或設定 setcap)
  • 核心編號從 0 開始
  • 綁定錯誤核心(超過實體核心數)會失敗
  • 效能調優需配合 perf、htop 觀察實際負載分佈
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved