kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Verwendung der POSIX-Library für Threads unter Linux

(EN google-translate)

(PL google-translate)

Teil 1 - Musterlösung zum Nachweis der Echtzeitfähigkeit

//Kompilieren:
//cc echtzeit.c -o echtzeit
//./echtzeit
// chrt 1 ./echtzeit

#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>

#define ANZAHL 10000
 
int main(int argc, char *argv[])
{
    struct timeval now;
    unsigned long zeit[ANZAHL];
    unsigned long zusatz = 0;
    unsigned long startzeit = 0;
    unsigned long mindist = 10000;
    unsigned long dist = 0;
    unsigned long t = 0;

    FILE* datei;

    unsigned long i=0;
    unsigned long k;

    for(i=0;i<ANZAHL;i++)
    {
        gettimeofday(&now, NULL);        
        zeit[i] = now.tv_usec;
    }

    //Überläufe behandeln
    for(i=1;i<ANZAHL;i++)
    {
        if(zeit[i]<zeit[i-1])
            zusatz+=1000000;
        zeit[i]+=zusatz;            
    }

    //Startzeit abziehen
    startzeit = zeit[0];
    for(i=0;i<ANZAHL;i++)
        zeit[i]-=startzeit;            

    //Minimalen Abstand finden
    for(i=1;i<ANZAHL;i++)
        if(zeit[i+1]-zeit[i]<mindist)
           mindist=zeit[i+1]-zeit[i];            

printf("mindist=%u\n",mindist);

    datei = fopen("./verlauf1.txt","w");
    fprintf(datei,"startzeit=%u;\n",startzeit);
    fprintf(datei,"matrix=[");
    for(i=0;i<ANZAHL-1;i++)
    {
        dist = zeit[i+1]-zeit[i];
        if(dist<=2*mindist)
        {
            for(k=0;k<dist;k++)
            {
                fprintf(datei,"%u 1\n",t);
                t++;
            }
        }
        else
        {
            for(k=0;k<dist;k++)
            {
                fprintf(datei,"%u 0\n",t);
                t++;
            }
        }
    }
    fprintf(datei,"];\n");
    fclose(datei);
}

Code 0-1: Quelltext echtzeit.c (vergl. Vorlesung).

Beispiel für die Prozeßaktivität bei einer 2-Kern-CPU OHNE andersweitige Last und OHNE besondere Priorisierung.

Bild 0-1: Beispiel für die Prozeßaktivität bei einer 2-Kern-CPU OHNE andersweitige Last und OHNE besondere Priorisierung.

Beispiel für die Prozeßaktivität bei einer 1-Kern-CPU mit hoher anderweitiger Prozeßlast und ohne besondere Priorisierung mit Echtzeit-Linux, Zeit in Mikrosekunden (Millionstel-Sekunden).

Bild 0-2: Beispiel für die Prozeßaktivität bei einer 1-Kern-CPU mit hoher anderweitiger Prozeßlast und ohne besondere Priorisierung mit Echtzeit-Linux, Zeit in Mikrosekunden (Millionstel-Sekunden).

Bei Echtzeit-Priorisierung des Testprozesses auf 1-Kern-CPU mit hoher anderweitiger Prozeßlast mit Echtzeit-Linux sinkt die Zyklusdauer durchgehend auf unter eine Mikrosekunde.

Im Unterricht werden die Möglichkeiten der pthread-library behandelt.

Aufgabe
  • Erarbeiten Sie die Möglichkeiten der pthread-library anhand folgender konkreten Aufgabenstellung:
  • Drei Threads, davon eines mit Echtzeit-Priorität sollen von einem Programm aus gestartet werden.
  • Die Threads sollen mit allen aktuell auf dem Rechner laufenden Prozessen konkurieren.
  • Die Threads sollen die gleiche Aufgabe erfüllen, wie die Testprogramme aus der letzten Vorlesung (s. Musterlösung oben).