đź’ľ
Betriebssysteme
  • Kursinformationen
    • Termine
  • Einheit 1: Git
    • Einheit 1: Hausaufgabe
  • Einheit 2: C Programmierung
    • Einheit 2: Hausaufgabe
  • Virtualization
    • Exercise: Process Creation
  • Speicher
    • Exercise: Memory
    • Lab 01: Stack
  • Scheduler
    • Exercise: Scheduler
  • Fortgeschrittene Scheduler
  • Fortgeschrittene Speicherverwaltung
    • Exkurs: Free List
    • Lab 02: Free List
  • Threads
    • Exkurs: Bugs durch Nebenläufigkeit
    • Exercise: Deadlock
  • Einheit 9: Semaphore
  • Einheit 10: Input / Ouput
  • Einheit 11: Harddisks & Dateisysteme
  • Einheit 12: Virtualisierung & Container Technologien
  • Einheit 13:
  • Lab 03: Semaphore
  • Lab 04: Canonical Treiber Implementierung
  • Page 1
Powered by GitBook
On this page
  • Voraussetzungen
  • Aufgabenstellung
  • Abgabe
  • Bewertung
Edit on GitHub

Lab 03: Semaphore

PreviousEinheit 13:NextLab 04: Canonical Treiber Implementierung

Last updated 11 months ago

Voraussetzungen

Nutzen Sie hierfĂĽr .

Sie können gcc unter Linux und/oder macOS direkt verwenden. Unter Linux installieren Sie gcc über Ihren Paket-Manager, unter macOX über .

Nutzen Sie Windows 10 können Sie entweder eine Linux in einer virtuellen Maschine (z.B. in ) nutzen, oder direkt das nutzen. Alternativ ist es möglich Windows Subsystem for Linux über den Windows App Store zu installieren.

In der Wahl der Linux Distribution sind sie frei, alle Beispiele in der Vorlesung werden jedoch unter Ubuntu (letzter stabiler Release) bewertet und eventuell vorgestellt.

Aufgabenstellung

  1. Implementieren Sie eine Semaphore auf Basis folgender Header-Datei (sem.h):

typedef struct
{
    // ...
} hhn_sem_t;

int hhn_sem_wait(hhn_sem_t *s);
int hhn_sem_post(hhn_sem_t *__sem);
int hhn_sem_init(hhn_sem_t *__sem, int __pshared, int __value);
int hhn_sem_destroy(hhn_sem_t *__sem);
  1. Ziel ist es die implementierung aus semaphore.h analog durch die implementierung aus sem.h zu ersetzen.

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sem;

void *thread_func(void *arg)
{
    int i;
    for (i = 0; i < 10; i++) {
        sem_wait(&sem);
        printf("Thread running\n");
        sem_post(&sem);
    }
    return NULL;
}

int main(void)
{
    pthread_t thread;
    sem_init(&sem, 0, 1);
    pthread_create(&thread, NULL, thread_func, NULL);
    int i;
    for (i = 0; i < 10; i++) {
        sem_wait(&sem);
        printf("Main thread running\n");
        sem_post(&sem);
    }
    pthread_join(thread, NULL);
    sem_destroy(&sem);
    return 0;
}

Dieses Programm erstellt eine Semaphore namens sem und initialisiert sie mit dem Wert 1. Es erstellt dann einen neuen Thread, der die Funktion thread_func ausfĂĽhrt. In der Hauptfunktion und im neuen Thread wird jeweils eine Schleife ausgefĂĽhrt, in der die Semaphore mit der Funktion sem_wait gesperrt wird, um den Zugriff auf eine gemeinsam genutzte Ressource zu synchronisieren. Nachdem die gemeinsam genutzte Ressource verwendet wurde, wird die Semaphore mit der Funktion sem_post freigegeben. Am Ende des Programms wird die Semaphore mit der Funktion sem_destroy freigegeben.

  1. Implementieren Sie eine Struktur hhn_sem_t und die, fĂĽr das vorherige Programm erforderlichen Funktionen (hhn_sem_wait, hhn_sem_post, hhn_sem_init, hhn_sem_destroy).

  2. Deklarieren Sie alle dafĂĽr erforderlichen Funktionen in einer Header Datei sem.h, tauschen Sie den Eintrag entsprechend in Ihrem Programm, so dass Ihre Implementierung der Semaphore verwendet wird.

#include <stdio.h>
#include <pthread.h>
#include "sem.h" 
  1. Zur Abgabe reichen Sie sowohl Ihr Hauptprogramm, das neue Header-File (sem.h) als auch die Datei mit der Implementierung Ihrer Semaphore ein.

Hinweis: Ziel der Aufgabenstellung ist es, dass Sie die Grundfunktionalität einer Semaphore nachbilden können. Die Implementierung Ihrer Semaphore muss daher nicht Thread-sicher sein.

Abgabe

Die Bewertung Ihrer Abgabe findet automatisch statt. Stellen Sie hierzu folgende Punkte sicher:

  • Ihre Lösung befindet sich im Ordner aufgabe3.

  • Ihre Implementierung befindet sich in einer Datei mit dem Namen sem.c.

  • Sie nutzen eine Header-Datei in der der obige Header hinterlegt ist.

  • Ihre Lösung checken Sie in Ihrem Repository ein.

Bewertung

  • Die Bewertung Ihrer Aufgabe findet anhand einer Reihe von automatisierten Tests statt.

  • Hierzu ist es erforderlich, dass die obigen Schritte exakt eingehalten werden.

  • Ihr Implementierung wird einer Reihe von automatisierten Tests unterzogen, die Ihre Implementierung auf Korrektheit ĂĽberprĂĽfen.

  • Abgaben, die nicht vollständig sind oder die Abgabekriterien nicht erfĂĽllen werden nicht bewertet.

  • Abgaben, die nicht fristgerecht eingereicht werden, werden nicht bewertet.

  • Nutzen Sie zur Abgabe ausschlieĂźlich das beschriebene Verfahren. Abgaben, die per E-Mail oder anderen Wegen eingereicht werden, werden nicht bewertet.

  • Abgaben, die aufgrund eines Fehlers nicht durch die Tests laufen, werden entsprechend mit weniger Punkten bewertet.

Zur Abgabe erhalten Sie einen Zugang zum hochschulinternen .

gcc
Homebrew
VirtualBox
Windows Subsystem for Linux (WSL 2.0)
GitLab