Itimer_real und itimer_virtual



  • Moin.
    Laut unserem Prof läuft itimer_real immer, egal welcher prozess im moment aktiv ist und itimer_virtual nur genau dann, wenn er prozess aktiv ist.
    wenn ich nun die pro sekunde berechneten primzahlen ausgeben lasse, müssten ja die von itimer_virtual berechneten mehr sein, da diese sekunde "länger ist", mindestens aber genauso viele wie bei itimer_real?! Schließlich wird der Prozess nicht 100% aktiv sein und bei itimer_real nicht ganz eine sekunde laufzeit schaffen.....

    Ich hab ein programm geschrieben, dass 10 sekunden lang(erst itimer_real, dann itimer_virtual) primzahlen berechnet und die anzahl der bearbeiteten zahlen und dann den durchschnitt ausgibt:

    fabian@linux-0zpr:~/Dokumente/uebung10> ./a.out
    Bisher berechnete Primzahlen:141396
    In der letzten Sekunde berechnete Primzahlen:141396
    Bisher bearbeitete zahlen:1890727
    In der letzten Sekunde bearbeitete Zahlen:1890727

    Bisher berechnete Primzahlen:220712
    In der letzten Sekunde berechnete Primzahlen:79316
    Bisher bearbeitete zahlen:3058771
    In der letzten Sekunde bearbeitete Zahlen:1168044

    Bisher berechnete Primzahlen:291119
    In der letzten Sekunde berechnete Primzahlen:70407
    Bisher bearbeitete zahlen:4120849
    In der letzten Sekunde bearbeitete Zahlen:1062078

    Bisher berechnete Primzahlen:354053
    In der letzten Sekunde berechnete Primzahlen:62934
    Bisher bearbeitete zahlen:5085803
    In der letzten Sekunde bearbeitete Zahlen:964954

    Bisher berechnete Primzahlen:411159
    In der letzten Sekunde berechnete Primzahlen:57106
    Bisher bearbeitete zahlen:5973497
    In der letzten Sekunde bearbeitete Zahlen:887694

    Bisher berechnete Primzahlen:465211
    In der letzten Sekunde berechnete Primzahlen:54052
    Bisher bearbeitete zahlen:6820783
    In der letzten Sekunde bearbeitete Zahlen:847286

    Bisher berechnete Primzahlen:513369
    In der letzten Sekunde berechnete Primzahlen:48158
    Bisher bearbeitete zahlen:7581181
    In der letzten Sekunde bearbeitete Zahlen:760398

    Bisher berechnete Primzahlen:562013
    In der letzten Sekunde berechnete Primzahlen:48644
    Bisher bearbeitete zahlen:8353979
    In der letzten Sekunde bearbeitete Zahlen:772798

    Bisher berechnete Primzahlen:608559
    In der letzten Sekunde berechnete Primzahlen:46546
    Bisher bearbeitete zahlen:9098237
    In der letzten Sekunde bearbeitete Zahlen:744258

    Bisher berechnete Primzahlen:650352
    In der letzten Sekunde berechnete Primzahlen:41793
    Bisher bearbeitete zahlen:9769391
    In der letzten Sekunde bearbeitete Zahlen:671154

    Durchschnittlich pro Sekunde bearbeitete Zahlen:976939
    Durchschnittlich pro Sekunde berechnete Primzahlen:65035
    Bisher berechnete Primzahlen:142407
    In der letzten Sekunde berechnete Primzahlen:142407
    Bisher bearbeitete zahlen:1905667
    In der letzten Sekunde bearbeitete Zahlen:1905667

    Bisher berechnete Primzahlen:142568
    In der letzten Sekunde berechnete Primzahlen:161
    Bisher bearbeitete zahlen:1907963
    In der letzten Sekunde bearbeitete Zahlen:2296

    Bisher berechnete Primzahlen:226557
    In der letzten Sekunde berechnete Primzahlen:83989
    Bisher bearbeitete zahlen:3145829
    In der letzten Sekunde bearbeitete Zahlen:1237866

    Bisher berechnete Primzahlen:226680
    In der letzten Sekunde berechnete Primzahlen:123
    Bisher bearbeitete zahlen:3147763
    In der letzten Sekunde bearbeitete Zahlen:1934

    Bisher berechnete Primzahlen:297090
    In der letzten Sekunde berechnete Primzahlen:70410
    Bisher bearbeitete zahlen:4211633
    In der letzten Sekunde bearbeitete Zahlen:1063870

    Bisher berechnete Primzahlen:297201
    In der letzten Sekunde berechnete Primzahlen:111
    Bisher bearbeitete zahlen:4213277
    In der letzten Sekunde bearbeitete Zahlen:1644

    Bisher berechnete Primzahlen:359399
    In der letzten Sekunde berechnete Primzahlen:62198
    Bisher bearbeitete zahlen:5168743
    In der letzten Sekunde bearbeitete Zahlen:955466

    Bisher berechnete Primzahlen:359498
    In der letzten Sekunde berechnete Primzahlen:99
    Bisher bearbeitete zahlen:5170201
    In der letzten Sekunde bearbeitete Zahlen:1458

    Bisher berechnete Primzahlen:412253
    In der letzten Sekunde berechnete Primzahlen:52755
    Bisher bearbeitete zahlen:5990473
    In der letzten Sekunde bearbeitete Zahlen:820272

    Bisher berechnete Primzahlen:412347
    In der letzten Sekunde berechnete Primzahlen:94
    Bisher bearbeitete zahlen:5991907
    In der letzten Sekunde bearbeitete Zahlen:1434

    Durchschnittlich pro Sekunde bearbeitete Zahlen:599190
    Durchschnittlich pro Sekunde berechnete Primzahlen:41234

    nun haben wir bei itimer_real jedoch knapp 1mill pro sekunde bearbeitete Zahlen, bei itimer_virtual nur 600.000..

    hab ich einen denkfehler?
    lg



  • fabian@pc schrieb:

    Laut unserem Prof läuft itimer_real immer, ...

    Ja ja, die Professoren. Reden viel Unsinn, wenn der Tag lang ist, dieser auch:

    http://www.fbi.h-da.de/~a.schuette/Vorlesungen/ProgrammierenII/Skript/19_C-Spezialitaeten/C-Spezialitaeten.pdf

    Ich kann bei mir keinen Itimer* Prozess finden und somit auch deine gänzlich nebulöse Frage nicht beantworten.
    Du solltest vielleicht ein paar Details nennen, damit du hier ein paar Antworten bekommst.
    Idealerweise sogar etwas Quellcode, wir sind hier in einem Programmiersprachen-Forum.



  • Den Quelltext habe ich grade nicht da-.-
    kurz gesagt habe ich mit
    struct itimerval itimer
    settimer(ITIMER_REAL, &itimer, NULL)
    einen timer gestartet, der jede sekunde ein Signal sendet, dessen Signalbehandlungsfunkion die Anzahl der bisher berechneten Primzahlen/bearbeiteten Zahlen ausgibt.
    Danach das selbe mit
    settimer(ITIMER_VIRTUAL, %itimer, NULL).

    also das unser Prof unsinn redet, würde ich erstmal nicht annehmen.
    laut ihm ist der unterschied zwischen real und virtual, dass bsp. wenn der timer auf 10 sek eingestellt ist, bei real nach 10 sekunden vergangener Zeit auf der Uhr das signal kommt und bei virtual nach 10 sekunden "prozesszeit", also wenn der prozess bsp nur zu 50% aktiv ist (z.b. wegen starker prozessorauslastung) demzufolge erst nach 20 sek echtzeit.

    also real läuft immer, virtual nur wenn der prozess aktiv ist.

    Der logik nach müsste nun aber real weniger zahlen schaffen als virtual, da bei z.b. den 50% real nur tatsächlich 5 sek rechnet, während 10 sekunden vergehen.
    bei mir ist das nicht so....

    ei, ich habs nicht so mit dem verständlichen ausdrücken, aber ich hoffe dass hier irgendjemand in dem Forum mich versteht^^
    liebe grüße


  • Mod

    Prinzipiell hat dein Prof da recht. Sofern dein Programm nicht parallelisiert ist, sollte die CPU Zeit ("virtual") <= Echtzeit sein. Da absolut unklar ist, was und wie du überhaupt gemessen hast, kann ich dir auch nicht mehr sagen, als dass du dann wohl entweder etwas falsch gemacht hast, deine Ergebnisse falsch interpretierst, oder du vergleichst Sachen die nicht vergleichbar sind. Aber das hast du wahrscheinlich schon geahnt, deswegen hast du ja gefragt.



  • Im zweiten Teil (den verstehe ich als den mit itimer_virtual verarbeiteten) schwankt die Anzahl der pro "Sekunde" verarbeiteten Zahlen auffällig stark, statt wie im ersten monoton zu fallen. Da wird irgendwo ein Fehler drinstecken.

    Auffällig ist, dass abwechselnd viele und wenige Zahlen pro Sekunde verarbeitet werden können, als (jetzt mal wild geraten) liefe der erste Timer noch, feuerte annähernd synchron mit dem ersten und führte auf diese Weise dazu, dass jede Sekunde als zwei Sekunden gewertet würde.



  • Hier eine man page.
    http://harmattan-dev.nokia.com/docs/library/html/manpages/man2/getitimer.2.html
    Das Ganze ist wohl eine Linux-Spezialität.

    Warum muss erst geschändet werden, wenn suchen so einfach ist? Oder war das alles ironisch gemeint?

    MfG f.-th.



  • #include <stdio.h>
    #include <unistd.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <math.h>
    void ende();
    int zaehler=0, zahl=0, primzahl=0;
    int berechnungen[10];
    int main(){
    
      sigset(SIGALRM, ende);
      sigset(SIGVTALRM, ende);
      struct itimerval realatime;
      realatime.it_interval.tv_sec=1;
       realatime.it_value.tv_sec=1;
        realatime.it_interval.tv_usec=0;
       realatime.it_value.tv_usec=0;
      setitimer(ITIMER_REAL, &realatime, NULL);
    
    while(zaehler!=10){
      if(isPrime(zahl))
        primzahl++;
      zahl++;
    }
    realatime.it_interval.tv_sec=0;
       realatime.it_value.tv_sec=0;
       setitimer(ITIMER_REAL, &realatime, NULL);
    int sum=0;
    int i;
    for(i=0;i<=9;i++)
      sum=sum+berechnungen[i];
    sum=sum/10;
    printf("Durchschnitt Real:%i\n", sum);
    
    zaehler=0;
    zahl=0;
    primzahl=0;
       struct itimerval virtualtime;
      virtualtime.it_interval.tv_sec=1;
       virtualtime.it_value.tv_sec=1;
        virtualtime.it_interval.tv_usec=0;
       virtualtime.it_value.tv_usec=0;
      setitimer(ITIMER_REAL, &virtualtime, NULL);
    while(zaehler!=10){
      if(isPrime(zahl))
        primzahl++;
      zahl++;
    
    }
    sum=0;
    for(i=0;i<=9;i++)
      sum=sum+berechnungen[i];
    sum=sum/10;
    printf("Durchschnitt virtual:%i\n", sum);
    
      return 0;
    }
    
    void ende(){
      printf("%i\n", primzahl);
     berechnungen[zaehler]=primzahl;
     zahl=0;
     primzahl=0;
    zaehler++;
    return;
    }
    
    int isPrime(int p){
      long s, d;
      s = (int) sqrt(p) + 1;
      if ( p <  2 ) return 0;
      if ( p == 2 ) return 1;
      if ( p % 2 == 0 ) return 0;
      for ( d = 3; d <= s; d+=2 )
        if ( p % d == 0 ) return 0;
      return 1;
    }
    

    hab den zähler eigentlich gestoppt. oder mach ich das falsch?

    lg


  • Mod

    Du setzt beide Male den ITIMER_REAL. Bloß weil deine Variable 'virtual' im Namen hat, funktioniert das nicht. setitimer kann nicht lesen 🙂 .

    Was mir bei mir auffällt, ist, dass ich ständig immer kleiner werdende Ergebnisse bekomme:

    99698
    57970
    48415
    43091
    39532
    36890
    34856
    33177
    31785
    30599
    Durchschnitt Real:45601
    99845
    57922
    48402
    43085
    39526
    36891
    34857
    33173
    31781
    30600
    Durchschnitt virtual:45608
    

    Das kann nicht richtig sein. Aber ich sehe gerade nicht, wo dran das liegt. Bei so vielen globalen Variablen bekomme ich Kopfschmerzen.

    edit: Ahh, habe den Fehler gefunden: Die Variablen für den globalen Zustand sollten wohl besser volatile sein, wenn du sie so wie hier benutzt. Dann passen auch die Ergebnisse:

    85647
    78473
    86718
    82822
    85173
    84662
    79483
    82438
    83098
    81881
    Durchschnitt Real:83039
    83008
    86487
    81342
    81739
    82498
    85437
    80834
    81455
    87127
    84209
    Durchschnitt virtual:83413
    

    Wobei dadurch natürlich die Peak-Leistung um 15-20% gesenkt wird, aber das ist sogar weniger als ich befürchtet hätte.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ich hab den Wald vor bäumen nicht gesehen:)
    klar muss da virtual stehen. schusselfehler:)
    danke 🙂


Anmelden zum Antworten