Thread Vergleichsmessungen unter Kernel 2.4 und 2.6
-
Hi @ All
habe da ein Problem von dem ich nicht weiß wo das herkommt. Ich habe auf einer Virtuellen Machine debian sarge mit 2.4 Kernel und ein Debian etch mit 2.6 Kernel installiert. Mein Programm wird beidesmal mit dem gcc 3.3 übersetzt.
Jetzt will ich ein Thread Library Vergleich machen der mir die Zeit für die benötigte Zeit für die Kritischen Bereiche ausgibt.
Im 2.6 Kernel funktioniert das Programm wunderbar und er gibt mir die benötigte Zeit aus.
Im 2.4 Kernel funktioniert das Programm leider nicht er gibt immer die gleiche Zeit aus.
An was könnte das liegen? Ich hoffe jemand weiß darüber bescheid.
Mit freundlichen Grüßen Toby
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <sys/times.h> //Prototypen void *functionC(); void *functionC1(); //Initialisierung der Mutex pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; //zu schützende Variable int counter = 0; //Die Thread Variablendefinition pthread_t thread1, thread2,thread3, thread4; //für die Testausgabe char *word[4] = {"this is thread1", "this is thread2", "this is thread3", "this is thread4" }; main() { //Error Codes int rc1, rc2, rc3, rc4; //Initialisierung der Zeitstrukturen für die Zeitmessung double clockticks, cticks; clock_t tcend,tcstart; struct tms tmend, tmstart; //Berechnung der Schlagzeiten des internen Quartz des Prozessors if((clockticks=(double)sysconf(_SC_CLK_TCK)) == -1) { perror("Bestimmung der Clock schlagzeiten pro sekunde Fehlgeschlagen"); return 1; } printf("Die Anzahl der Ticks betraegt %f\n",clockticks); //fehlerbehandlung if(clockticks == 0) { printf("Die Anzahl der Ticks ist nicht gültig\n"); return 1; } //starten des Timers if((tcstart = times(&tmstart)) == -1) { perror("Failed to get start time"); return 1; } //erzeugung der Threads if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) ) { printf("Thread creation failed: %d\n", rc1); } if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) ) { printf("Thread creation failed: %d\n", rc2); } if( (rc3=pthread_create( &thread3, NULL, &functionC, NULL)) ) { printf("Thread creation failed: %d\n", rc3); } if( (rc4=pthread_create( &thread4, NULL, &functionC, NULL)) ) { printf("Thread creation failed: %d\n", rc4); } //Warten bis threads beendet sind pthread_join( thread1, NULL); pthread_join( thread2, NULL); pthread_join( thread3, NULL); pthread_join( thread4, NULL); //Endzeit abholen if((tcend = times(&tmend)) == -1) { perror("Keine Endzeit bekommen"); return 1; } //Abgelaufene Zeit berechnen cticks = tmend.tms_utime + tmend.tms_stime -tmstart.tms_utime - tmstart.tms_stime; printf("Die CPU benoetigte Zeit ist %f Sekunden\n",cticks/clockticks); return 0; } //Dummy Funktion der Threads void *functionC() { int n=0; int i; while(n<2500) { //mögliche Testausgabe /*if (pthread_equal (pthread_self(), thread1)) printf ("%s\n", word[0]); if (pthread_equal (pthread_self(), thread2)) printf ("%s\n", word[1]); if (pthread_equal (pthread_self(), thread3)) printf ("%s\n", word[2]); if (pthread_equal (pthread_self(), thread4)) printf ("%s\n", word[3]); */ //Absichern des Kritischen Bereichs pthread_mutex_lock( &mutex1 ); counter++; //printf("Counter value: %d\n",counter); pthread_mutex_unlock( &mutex1 ); n++; //busy wait for(i=0;i<=2000000;i++); } }
-
ohne mir den code angeschaut zu haben... vielleicht weil native threads erst im 2.5er entwicklungszweig einzug gefunden haben?!
-
es soll ein Vergleich von den alten Linuxthreads Lib zu der neuen Nativ Posix thread lib erstellt werden. deshalb ist das schon korrekt
-
dann musst du auch die api für die alten linuxthreads benutzen, sprich auch eine libc die mit linuxthreadsunterstützung kompiliert wurde haben
edit: da wurde mit clone() gearbeitet:
int clone(int (*fn)(), void **stack, int flags, int argc,... /* args */);
-
danke für deine hilfe aber ich habe extra alle packete von debian sarge installiert
und dann noch ein extra debian etch installiert da müssten doch die libs sowieso anders sein?ich denke auch die das die Threads richtig funktionieren. Nur die Zeitmessung geht unterm 2.4 nicht richtig
-
toby138 schrieb:
danke für deine hilfe aber ich habe extra alle packete von debian sarge installiert
und dann noch ein extra debian etch installiert da müssten doch die libs sowieso anders sein?probiers einfach aus, mach dich über diesen alten clone() kram schlau, da gibts bestimmt noch ein paar beispiele, und versuchs zu kompilieren. gcc wird schon meckern wenn er was nicht findet
-
ich kenne mich aus in den linux thread libs da habe ich gerade eine Arbeit darüber geschrieben. es sind auch nicht die threads die nicht funktionieren sondern die Zeitmessungen. Die funktioniert nicht beim 2.4 Kernel.
-
auch schon mal andere methoden auser times() versucht um dies als fehlerquelle ausschließen zu können? clone() kopiert imho den prozess im userspace, von daher könnten je nach scheduling bei times() durchaus irrationale werte herauskommen.
-
stimmt ja ich werde das mal anders ausprobieren
melde mich dann wieder