2015-11-04 18 views
7

10 iş parçacığı ile çalışan bir örnek C++ çok iş parçacıklı programı yazdı, her iş parçacığı yüksek öncelikli ve yakınlığa ayarlandı. Derlenmiş ve centos 7 (Linux çekirdeği - 3.10.0-229), devre dışı hiper iş parçacığı çalıştıran 16 çekirdeği olan dell makinesinde bu kodu çalıştırdım. Bu kodu çalıştırdıktan sonra, birkaç saniye içinde Linux makinemiz yanıt vermiyor, Eclipse editörünü açıp dosya kaydetme veya bir dosyayı kaydetme veya bu uygulamaları kaydetme seçeneği. İlginç bir şekilde, bu programı/işlemi durdurduğumda, tüm diğer uygulamalar kaldıkları yerden devam eder. Ayrıca, bu 10 iş parçacığından önceliği kaldırırsam bu sorunu görmüyorum.Birden çok yüksek öncelikli iş parçacığı birden çok çekirdek üzerinde çalıştırıldığında Linux çekirdeği yanıt vermiyor

sorular:

1) 16 çekirdek dışında, 6 maçalar hala işlemci kullanıcı alanı% 62.9 çalıştırılır ve% 37.1 boşta olduğu, işlemci kullanımı gösterir yukarıdaki (makinenin sol İlginç bir şekilde% 0 cpu. kernel uzayda kullanımı), bu nedenle ideal çekirdek diğer uygulamaları ele almak için 6 çekirdeği kullanmış olmalı, diğer uygulamanın çalışamaması sebebi ne olabilir? Uyku/değişim önceliği getirmeden bu sorunu nasıl çözebilirim? 2) Paralellik elde etmek için iş parçacığındaki bir uyku/bekleme olayının (çekirdek içerik anahtarından dolayı minimum gecikme sağlayan) dışında, daha iyi bir yaklaşım olduğunu bilmek ister misiniz? altına

%Cpu(s): 62.9 us, 0.0 sy, 0.0 ni, 37.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 

1107 arun  rt 0 96748 1112 932 R 99.9 0.0 0:25.78 PthreadTest 
1115 arun  rt 0 96748 1112 932 R 99.9 0.0 0:24.79 PthreadTest 
1118 arun  rt 0 96748 1112 932 R 99.9 0.0 0:22.79 PthreadTest 
1120 arun  rt 0 96748 1112 932 R 99.9 0.0 0:20.79 PthreadTest 
1123 arun  rt 0 96748 1112 932 R 99.9 0.0 0:18.79 PthreadTest 
1117 arun  rt 0 96748 1112 932 R 94.1 0.0 0:23.78 PthreadTest 
1119 arun  rt 0 96748 1112 932 R 94.1 0.0 0:21.78 PthreadTest 
1122 arun  rt 0 96748 1112 932 R 94.1 0.0 0:19.78 PthreadTest 
1124 arun  rt 0 96748 1112 932 R 94.1 0.0 0:17.78 PthreadTest 
1125 arun  rt 0 96748 1112 932 R 94.1 0.0 0:16.76 PthreadTest 

Kodu:

#include <unistd.h> 
#include <iostream> 
#include <cstdlib> 
#include <pthread.h> 

using namespace std; 

#define NUM_THREADS 10 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 

    cout << "Hello World! Thread ID, " << tid << endl; 
    while(true) 
    { 
     continue; 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    pthread_t threads[NUM_THREADS]; 
    pthread_attr_t threads_attr[NUM_THREADS]; 
    struct sched_param  params; 
    params.sched_priority = sched_get_priority_max(SCHED_FIFO); 
    int rc; 
    int i; 
    int cpu_num = 0; 

    for(i=0; i < NUM_THREADS; i++){ 

     cpu_set_t cpu; 
     CPU_ZERO(&cpu); 
     CPU_SET(cpu_num, &cpu); 
     cout << "main() : creating thread, " << i << "cpu_num : "<<cpu_num<<endl; 
     pthread_attr_init(&threads_attr[i]); 
     pthread_attr_setscope(&threads_attr[i], PTHREAD_SCOPE_SYSTEM); 
     rc = pthread_create(&threads[i], NULL, 
          PrintHello, (void *)i); 
     if (rc){ 
     cout << "Error:unable to create thread," << rc << endl; 
     exit(-1); 
     } 

     sleep(1); 


     int ret = pthread_setaffinity_np(threads[i], sizeof(cpu_set_t), &cpu); 
     if(ret == 0 && CPU_ISSET(cpu_num, &cpu)) 
     { 
     cout << "Thread " << i << " affinity set " <<endl; 
     } 


     ret = pthread_setschedparam(threads[i], SCHED_FIFO, &params); 
     if(ret == 0) 
     { 
     cout << "Thread " << i << " priority set " <<endl; 
     } 
     cpu_num++; 
    } 


// free attribute and wait for the other threads 
    void *status; 
    for(i=0; i < NUM_THREADS; i++) 
    { 
     rc = pthread_join(threads[i], &status); 
     if (rc){ 
      cout << "Error:unable to join," << rc << endl; 
      exit(-1); 
     } 
     cout << "Main: completed thread id :" << i ; 
     cout << " exiting with status :" << status << endl; 
    } 

    pthread_exit(NULL); 
} 

Derleme:

g++ -std=c++14 -g -o PthreadTest busywait.cpp -lpthread 
+1

sorun ilginç ama meraktan, neden yüksek öncelikte Bunları çalıştıran @

? Daha yüksek öncelikli CPU yiyen iş parçacıklarına sahip olmak, daha düşük öncelikli programları asmak için gereken reçetedir ... –

+2

İşlemciler her zaman CPU'nun bir önceliğe sahip olmasını önleyecek özelliklere sahip olmalıdır. –

+0

Bu makinede hangi CPU var? Ve neden GCC/linux ile '-lpthread' belirtiyorsunuz? (Doğru bayrak -preaddir.) –

cevap

1

üst komutunu (top -H) RanBir çekirdeğin herhangi bir kullanımının aniden sınırsız bir süre kullanılmasından kaynaklanan etkilerin belirtilmemiş ve bilinmeyen etkileri. Özel olarak sahiplenmeden önce, bu çekirdeğe eklenmiş herhangi bir şey, üzerinde planlanmayı bekleyen iplikleri içerebilecek şekilde, sisteme sonsuza dek kaybedilir.

BU YAPMAYIN!

+0

Amaç, (Matteo Italia'ya adreslenmiş) sorunun ana yorum alanında açıklandı. CPU bu makinede Intel Xeon CPU var. – arun

+1

İplik uyandığında neden düşük performans aldığınızı anlamanızı öneririm. Bu çok sıradışı. İş parçacığı yalnızca sıra boşsa ve yalnızca en az gerektiği kadar performans gösterdiğinizde sıra boş olmalıdır. –

+0

Ayrıca "Xeon" belirli bir işlemci değil, bir işlemciler dizisidir. Bu makinenin hangi özel işlemcinin (veya işlemcilerin) olduğunu bilmek istiyorum. –

-1

Yüksek öncelikli iş parçacığına sahip sıkı döngü iyi bir fikir değildir ... baskı merhaba hiçbir şey yapmadan sadece döngü oluşturduğunda, belirli döngülerden sonra anahtarlama/verimi başlat ve daha yüksek döngü sayısından sonra sıfır uyu. Bu, sistemin çalışabilmesi için başka bir iş parçacığı verecektir. Çalışma olmadığı zaman, bir olay tanıtıcısında beklemek. kiran0x1B

İlgili konular