Systemprogrammierung - AIN/2
Sommersemester 2025


Übungsaufgabe 3: C Strings und Funktionen

Abgabe bis 9.5.2025

Migration von Java nach C: Stringsort

Das Java-Programm ⤵ Stringsort.java erzeugt zufällige Ziffernstrings und gibt sie alphabetisch (nicht numerisch!) sortiert aus. Dabei werden mehrfach vorkommende Strings nur einmal ausgegeben. Jedes weitere Vorkommen wird mit einem angehängten Stern angezeigt. Stellen Sie dieses Java-Programm auf C um:

Denken Sie an die Fehlerbehandlung nach den Speicherreservierungen sowie an die Freigabe des Speichers am Programmende.


Test

Speichern Sie die Datei ⤵ Makefile (ohne Endung .txt !!!) in Ihr Arbeitverzeichnis der Aufgabe 3 und verwenden Sie zum Testen die Befehle:

    javac Stringsort.java
    java Stringsort 200
    make
    ./stringsort 200
    valgrind ./stringsort 200
    make cppcheck

Testen Sie Ihre C-Programm mit den Array-Größen 0, 1, 2, 20 und 200, und rufen Sie es auch ohne Angabe einer Array-Größe auf:

Bessern Sie gegebenenfalls nach.


Optimierung des Speicherbedarfs

Ihr nach der obigen Anleitung erstelltes C-Programm braucht unnötig viel Heapspeicher, weil es viele sehr kleine Speicherstücke reserviert. Pro Speicherstück muss sich die Speicherverwaltung die Länge merken. Außerdem liefert die Speicherverwaltung für beliebige Datentypen ausgerichtete Adressen, also typischerweise durch 16 teilbare Adressen. Das führt zu einer Aufrundung des tatsächlich belegten Speichers. Bei zum Beispiel angeforderten 4 Byte werden dadurch inklusive der Längeninformation vermutlich 32 Byte belegt. Und nur wegen der verstreuten Speicherung der einzelnen Strings in jeweils eigenen Heap-Stücken wird überhaupt das Array von String-Zeigern gebraucht.

Kopieren Sie Ihre Datei stringsort.c nach stringsort-optimiert.c und optimieren Sie das kopierte Programm wie folgt:

Hinweis: der zusammenhängende Speicherbereich ist im Prinzip eine n-mal-m-Matrix von Zeichen, realisiert als Array von Arrays auf dem Heap. Weil beide Matrixdimensionen, die Anzahl der Strings und die maximale String-Länge, erst zur Laufzeit feststehen, müssen Sie statt mit Index-Operator mit Adressrechnung arbeiten.

Testen Sie das optimierte Programm:

    make TARGET=stringsort-optimiert
    make TARGET=stringsort-optimiert cppcheck
    ./stringsort-optimiert 200
    valgrind ./stringsort-optimiert 200

Ist das speicher-optimierte Programm schneller als das nicht optimierte?

    time ./stringsort 20000 > /dev/null
    time ./stringsort-optimiert 20000 > /dev/null

Protokoll

Erstellen Sie ein Protokoll der Tests Ihrer beiden Programmvarianten. Gehen sie wieder so vor wie in Aufgabe 1 beschrieben. Nennen Sie die Protokolldatei protokoll-aufgabe3.txt und ergänzen Sie darin Ihre Antworten auf alle Fragen.


Abgabe

Führen Sie die beiden Programme und Ihre Protokolldatei vor.
Zeigen Sie das ausgefüllte Teilnahmeprotokoll.

Hinweis:
Der Compiler gcc darf für Ihr Programm keine Fehler oder Warnungen mehr ausgeben.
Ihre Programme müssen außerdem ordentlich formatiert sein. Bessern Sie die Formatierung gegebenenfalls mit astyle nach:
  astyle -p -H --style=ansi stringsort.c stringsort-optimiert.c


Freiwillige Zusatzaufgabe (1 Bonuspunkt)

Das Programm stringsort-optimiert wird durch die memcpy-Aufrufe in der Funktion bubblesort ausgebremst. Legen Sie eine Kopie stringsort-superoptimiert.c von stringsort-optimiert.c an und erweitern Sie darin bubblesort so, dass im Falle einer Arrayelementgröße von sizeof (uintmax_t) die Strings per Zuweisungen statt per memcpy getauscht werden. Tun Sie dafür in diesem Fall so, als würden Sie ein Array mit uintmax_t-Elementen sortieren, aber verwenden Sie für den Elementvergleich weiterhin die übergebene Vergleichsfunktion. Runden Sie in main die maximale String-Länge m auf den Wert sizeof (uintmax_t) auf. Auf einer LP64-Plattform werden dann immer mindestens 8 Byte für einen String allokiert.

Ist das superoptimierte Programm schneller als die beiden ursprünglichen Programme?



Prof. Dr. H. Drachenfels
Hochschule Konstanz - Impressum - Datenschutzerklärung
Letzte Änderung: 27.2.2025