簡體   English   中英

設置與進程的CPU親和力-C-Linux

[英]Setting CPU affinity to a process - C - Linux

這不是C編程中最好的,這是我第一次嘗試將程序從python移植到C。下面的程序要感謝Alnitak

#include<sched.h>

void task_set(int pid) {
        int result;
        cpu_set_t  mask;
        CPU_ZERO(&mask);
        CPU_SET(pid, &mask);
        result = sched_setaffinity(0, sizeof(mask), &mask);
        printf ("%d\n",result);
}

void main()
{ //excuse me for the static
task_set(1400);
}

為了編譯,我這樣做了。

gcc -D_GNU_SOURCE -o test test.c

但是,當我嘗試返回並使用以下腳本檢查程序在哪里運行時:

def which_core(pid):
        f = file(os.path.join('/proc', str(fpid), 'stat'), 'rb')
        val = f.read()
        f.close()
        return int(val.split(' ')[-6])
print 'core_id',which_core(1400)

它給了我以下輸出:

core_id 32997376

那里真令人困惑……這是什么錯誤?

好。 這是有史以來最愚蠢的事情!

    CPU_SET(pid, &mask);

    CPU_SET(coreid, &mask);

將pid更改為coreid即可

另一個錯誤在這里:

    result = sched_setaffinity(pid, sizeof(mask), &mask);

您可能正在尋找字段39(從1開始計數)

處理器%d(自Linux 2.2.8起)最后執行的CPU號。

(來自man proc

(編輯:畢竟看起來是-6 = 39,很抱歉沒有注意到:-P)

解析/proc/[pid]/stat文件有點棘手,因為您可以在文件名中包含空格和括號。 這些都無法逃脫。

要查看非常真實的效果,請運行

cp /bin/cat ') fake (' && './) fake (' < /proc/self/stat && rm -f ') fake ('

正確的做法是直到但不包括第一次出現的采取一切" ("pid ,進程ID,一切直到但不包括最后出現的") "comm ,該進程可執行文件的文件名。 (其他字段都不是字符串類型,因此您在文件的其他位置都不會看到任何括號。)以下所有字段均由空格分隔,並在man 5 proc /proc/[pid]/stat 處理器是comm的第37個字段,或總共第39個字段。 (在x86-64上的Ubuntu 3.8.0-25-generic上,該字段從末尾開始倒數第14位,而不是倒數第六位-但這可能會發生變化,因為總可以在末尾添加新字段。)

如果將自己限制為Linux 2.6.26和更高版本(包括所有3.xy版本和更高版本),則可以只查看/proc/[pid]/status中的Cpus_allowed_list:行。 解析起來更容易,並且告訴內核允許進程運行的內核,而不僅僅是進程最后運行在哪個CPU上( /proc/[pid]/stat中的processor字段描述了哪個)。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM