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:1890727Bisher berechnete Primzahlen:220712
In der letzten Sekunde berechnete Primzahlen:79316
Bisher bearbeitete zahlen:3058771
In der letzten Sekunde bearbeitete Zahlen:1168044Bisher berechnete Primzahlen:291119
In der letzten Sekunde berechnete Primzahlen:70407
Bisher bearbeitete zahlen:4120849
In der letzten Sekunde bearbeitete Zahlen:1062078Bisher berechnete Primzahlen:354053
In der letzten Sekunde berechnete Primzahlen:62934
Bisher bearbeitete zahlen:5085803
In der letzten Sekunde bearbeitete Zahlen:964954Bisher berechnete Primzahlen:411159
In der letzten Sekunde berechnete Primzahlen:57106
Bisher bearbeitete zahlen:5973497
In der letzten Sekunde bearbeitete Zahlen:887694Bisher berechnete Primzahlen:465211
In der letzten Sekunde berechnete Primzahlen:54052
Bisher bearbeitete zahlen:6820783
In der letzten Sekunde bearbeitete Zahlen:847286Bisher berechnete Primzahlen:513369
In der letzten Sekunde berechnete Primzahlen:48158
Bisher bearbeitete zahlen:7581181
In der letzten Sekunde bearbeitete Zahlen:760398Bisher berechnete Primzahlen:562013
In der letzten Sekunde berechnete Primzahlen:48644
Bisher bearbeitete zahlen:8353979
In der letzten Sekunde bearbeitete Zahlen:772798Bisher berechnete Primzahlen:608559
In der letzten Sekunde berechnete Primzahlen:46546
Bisher bearbeitete zahlen:9098237
In der letzten Sekunde bearbeitete Zahlen:744258Bisher berechnete Primzahlen:650352
In der letzten Sekunde berechnete Primzahlen:41793
Bisher bearbeitete zahlen:9769391
In der letzten Sekunde bearbeitete Zahlen:671154Durchschnittlich 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:1905667Bisher berechnete Primzahlen:142568
In der letzten Sekunde berechnete Primzahlen:161
Bisher bearbeitete zahlen:1907963
In der letzten Sekunde bearbeitete Zahlen:2296Bisher berechnete Primzahlen:226557
In der letzten Sekunde berechnete Primzahlen:83989
Bisher bearbeitete zahlen:3145829
In der letzten Sekunde bearbeitete Zahlen:1237866Bisher berechnete Primzahlen:226680
In der letzten Sekunde berechnete Primzahlen:123
Bisher bearbeitete zahlen:3147763
In der letzten Sekunde bearbeitete Zahlen:1934Bisher berechnete Primzahlen:297090
In der letzten Sekunde berechnete Primzahlen:70410
Bisher bearbeitete zahlen:4211633
In der letzten Sekunde bearbeitete Zahlen:1063870Bisher berechnete Primzahlen:297201
In der letzten Sekunde berechnete Primzahlen:111
Bisher bearbeitete zahlen:4213277
In der letzten Sekunde bearbeitete Zahlen:1644Bisher berechnete Primzahlen:359399
In der letzten Sekunde berechnete Primzahlen:62198
Bisher bearbeitete zahlen:5168743
In der letzten Sekunde bearbeitete Zahlen:955466Bisher berechnete Primzahlen:359498
In der letzten Sekunde berechnete Primzahlen:99
Bisher bearbeitete zahlen:5170201
In der letzten Sekunde bearbeitete Zahlen:1458Bisher berechnete Primzahlen:412253
In der letzten Sekunde berechnete Primzahlen:52755
Bisher bearbeitete zahlen:5990473
In der letzten Sekunde bearbeitete Zahlen:820272Bisher berechnete Primzahlen:412347
In der letzten Sekunde berechnete Primzahlen:94
Bisher bearbeitete zahlen:5991907
In der letzten Sekunde bearbeitete Zahlen:1434Durchschnittlich pro Sekunde bearbeitete Zahlen:599190
Durchschnittlich pro Sekunde berechnete Primzahlen:41234nun 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:
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
-
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
-
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