5. Caching / Memoziation
Problem: I/O-Operationen sehr aufwändig!
Datei bei ersten Aufruf von uid2name parsen und in
Prozessspeicher chachen
Ursprünglich Verbessert
passwd Datei wurde bei jedem Aufruf Beim 1. Aufruf:
von uid2name mittels I/O- passwd Datei komplett einlesen,
Operationen durchsucht notwendige Informationen intern
cachen und Datei wieder schließen
Ab 2. Aufruf:
Ergebnis aus Cache (Liste,
Array) zurückliefern.
7. Binäre Suche
Problem: Lineare Suche in interner Datenstruktur (unsortiertes
Array) ist sehr aufwändig.
Lösungsvorschlag: Binäre Suche in interner Datenstruktur.
Vorteil Nachteile
• Sortierung der Datenstruktur
• Geringerer Suchaufwand, im notwendig (hoher Sortieraufwand). In
Vergleich zu linearer Suche. unserem Fall war dies zwar nicht
• Da passwd Datei "fast" sortiert notwendig, konnten aber durch die
ist, muss interne Datenstruktur Rechenoperationen (/2, etc.) nicht viel
nicht sortiert werden. Rechenzeit gewinnen. Weiters
können nicht richtig einsortierte
Lineare Suche für "Ausreißer"
Elemente die gesamte Suche als
ganzes in vielen Fällen zunichte
machen.
8. Öffnen der Datei - mmap
Bisherige Version Verbessert
fopen() open()
pro Zeile getline() (char *) mmap()
mmap() liefert Pointer auf
char im Speicher, pro Zeile
auslesen fällt weg.
9. Speicher von mmap() verwenden
(while-body)
len = map; //aktuelle Pos. im Speicher
while(*len != ':') len++; //bis zum ersten : in Zeile gehen
old = map; //aktuelle Pos. speichern
map = len + 1; //im Speicher bis nach : weitergehen
map += 2; //:x: überspringen
len = map; //aktuelle Pos. nach :x: setzen
while(*len != ':') len++; //weiter bis nächsten :
fach = atoi(map); //nach :x: ist UID
map = len + 1; //nach UID positionieren
filecn[fach] = old; //old zeigt auf UName
10. Speicher von mmap() verwenden II
- Trotz Speicherverwendung sehr landsam: ~3.1 Mio
Iterationen
- Speicher von char-Pointern ebenfalls Verwalten
- Gesamte Datei im Speicher (!!)
mit strcpy realisieren, genauso langsam/schnell
11. Direct Memory-Access
Problem: Iterativer Suchaufwand von O(n2)
Iterative Suche durch (direkten) Speicherzugriff ersetzen
Ursprünglich Verbessert
• Stützung von Modulo-Algebra
linearer Suchaufwand zum • Einordnung der gecachten Daten
Durchsuchen der gecachten Daten
in Equivalenzklassen (Kongruenz-
(Tuppel aus UID und Benutzername)
Klassen)
• Lineare Suche innerhalb dieser
Klassen
• 3K Klassen ~ DMA