2013-12-12 49 views
0

我有搜索關於CPU親和力的問題/答案,並閱讀結果,但我仍然無法讓我的線程釘上一個CPU。爲什麼系統監視器不顯示正確的CPU關聯性?

我正在研究一個將在專用Linux機器上運行的應用程序,所以我不關心其他進程,只有我自己的。此應用程序當前生成一個pthread,然後主線程進入while循環以使用POSIX msg隊列處理控制消息。這while循環阻止等待控件味精進來,然後處理它。所以主線程非常簡單而且非關鍵。我的代碼工作得很好,因爲我可以發送這個應用程序消息,它會處理它們就好了。所有的控制消息都是非常小的尺寸,用於控制應用程序的功能,也就是說,只有少數控制消息被髮送/接收。

在我進入這個while循環之前,我使用sched_getaffinity()來記錄所有可用的CPU。然後我使用sched_setaffinity()將此進程設置爲單個CPU。然後我再次調用sched_getaffinity()來檢查它是否設置爲僅在一個CPU上運行,並且確實是正確的。

產生的單個pthread也做類似的事情。我在新創建的pthread中做的第一件事是調用pthread_getaffinity_np()並檢查可用的CPU,然後調用pthread_setaffinity_np()將其設置爲不同的CPU,然後調用pthread_getaffinity_np()檢查它是否設置爲所需,並且確實如此正確。

這是令人困惑的。當我運行應用程序並在系統監視器中查看CPU歷史記錄時,我發現沒有與運行該應用程序時沒有所有這些設置親和性內容的區別。調度程序仍然在這個四核心盒上的4個CPU中運行幾秒鐘。所以看起來調度器忽略了我的親和力設置。

我錯在期待看到一些證明,主線程和pthread實際上是在他們自己的單CPU中運行?還是我忘了做更多的事情來讓它按照我的意圖工作?

感謝,

-Andres

回答

0

你沒有答案,我會給你我所:有些偏幫

假設你從pthread_setaffinity_np檢查返回值:

如何你分配你的cpuset非常重要,在主線程中創建它。爲了你想要的。它將傳播到連續的線程。你檢查了返回碼嗎?

您實際獲得的cpuset將是硬件可用的cpus和您定義的cpuset的交集。 min.h下面的代碼是一個通用的構建包含文件。您必須定義_GNU_SOURCE - 請注意comment on the last line of the code.CPUSETCPUSETSIZE是宏。我想我把它們定義在別的地方,我不記得了。他們可能在一個標準的標題。

#define _GNU_SOURCE 
#include "min.h" 
#include <pthread.h> 


int 
main(int argc, char **argv) 
{ 
    int s, j; 
    cpu_set_t cpuset; 
    pthread_t tid=pthread_self(); 

    // Set affinity mask to include CPUs 0 & 1 

    CPU_ZERO(&cpuset); 
    for (j = 0; j < 2; j++) 
     CPU_SET(j, &cpuset); 

    s = pthread_setaffinity_np(tid, sizeof(cpu_set_t), &cpuset); 
    if (s != 0) 
    { 
     fprintf(stderr, "%d ", s); 
     perror(" pthread_setaffinity_np"); 
     exit(1); 
    } 
    // lets see what we really have in the actual affinity mask assigned our thread 

    s = pthread_getaffinity_np(tid, sizeof(cpu_set_t), &cpuset); 
    if (s != 0) 
    { 
     fprintf(stderr, "%d ", s); 
     perror(" pthread_setaffinity_np"); 
     exit(1); 
    } 

    printf("my cpuset has:\n"); 
    for (j = 0; j < CPU_SETSIZE; j++) 
     if (CPU_ISSET(j, &cpuset)) 
      printf(" CPU %d\n", j); 
    // @Andres note: any pthread_create call from here on creates a thread with the identical 
    // cpuset - you do not have to call it in every thread. 
    return 0; 
} 
相關問題