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


Log in to reply