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, ¶ms);
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
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 ... –
İşlemciler her zaman CPU'nun bir önceliğe sahip olmasını önleyecek özelliklere sahip olmalıdır. –
Bu makinede hangi CPU var? Ve neden GCC/linux ile '-lpthread' belirtiyorsunuz? (Doğru bayrak -preaddir.) –