// Uebung 9 zum Fach Betriebssysteme // zu kompilieren mit: "gcc -Wall -lrt -lm -o Bs1ueb9 Bs1ueb9.c" // Copyright Matthias Jauernig, 03IN #include #include #include #include #include #include #include #include #include #include bool reset; int i; void sigtimerfkt(int signr){ reset = true; } double x(double t){ double a = 1e-8; // Flankenabfallzeit double f = 1e7; // Frequenz return (4 / (a*M_PI)*(sin(a)*sin(2*M_PI*f*t) + (1/9)*sin(3*a)*sin(2*M_PI*f*t))); } int main(void){ int j, durchschnitt, durchns; struct itimerval itime; // Signalfunktionen setzen sigset(SIGALRM, sigtimerfkt); sigset(SIGVTALRM, sigtimerfkt); // itime initialisieren timerclear(&itime.it_value); timerclear(&itime.it_interval); // ITIMER_REAL itime.it_value.tv_sec = 1; itime.it_interval.tv_sec = 1; setitimer(ITIMER_REAL, &itime, NULL); durchschnitt = 0; durchns = 0; printf("in ITIMER_REAL:\n"); fflush(stdout); for(j=0; j<10; j++){ reset = false; for(i=0;; i++){ // Endlosschleife if(!reset) x(i*1e-17); else break; } printf("Zyklus %d: \t%d Durchlaeufe, \t%d Nanosekunden pro Durchlauf.\n",j+1,i,(int)1e9/i); fflush(stdout); durchns += (int)1e9/i; durchschnitt += i; } durchschnitt /= 10; durchns /= 10; printf("\nITIMER_REAL - Durchschnittliche Ausführungen von x(t) pro Sekunde: %d\n",durchschnitt); printf("ITIMER_REAL - Durchschnittliche Nanosekunden fuer x(t) benoetigt: %d\n\n",durchns); // ITIMER_REAL inaktiv setzen itime.it_value.tv_sec = 0; setitimer(ITIMER_REAL, &itime, NULL); // ITIMER_VIRTUAL itime.it_value.tv_sec = 1; itime.it_interval.tv_sec = 1; setitimer(ITIMER_VIRTUAL, &itime, NULL); durchschnitt = 0; durchns = 0; printf("in ITIMER_VIRTUAL:\n"); for(j=0; j<10; j++){ reset = false; for(i=0;; i++){ // Endlosschleife if(!reset) x(i*1e-17); else break; } printf("Zyklus %d: \t%d Durchlaeufe, \t%d Nanosekunden pro Durchlauf.\n",j+1,i,(int)1e9/i); fflush(stdout); durchns += (int)1e9/i; durchschnitt += i; } durchschnitt /= 10; durchns /= 10; printf("\nITIMER_VIRTUAL - Durchschnittliche Ausführungen von x(t) pro Sekunde: %d\n",durchschnitt); printf("ITIMER_VIRTUAL - Durchschnittliche Nanosekunden fuer x(t) benoetigt: %d\n\n",durchns); // ITIMER_VIRTUAL inaktiv setzen itime.it_value.tv_sec = 0; setitimer(ITIMER_VIRTUAL, &itime, NULL); return 0; }