-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.txt
67 lines (53 loc) · 7.68 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
ΒΑΣΙΛΑΚΗΣ ΒΑΣΙΛΕΙΟΣ ΑΜ : 1115201800018
ΕΝΤΟΛΗ ΕΚΤΕΛΕΣΗΣ :
Για την δημιουργία του citizenRecordsFile.txt :
Στο bash:
./testFile.sh viruses.txt countries.txt numLines 0/1
όπου numLines ο αριθμός των εγγραφών πολιτών, 0/1 αν 0 τότε δεν επιτρέπονται duplicates, αν 1 επιτρέπονται
Επειδή τα ids είναι το πολύ τετραψήφιοι αριθμοί, υπέθεσα ότι το numLines στο script είναι το πολύ 10000
Για την δημιουργία του εκτελέσιμου :
make vaccineMonitor
./vaccineMonitor -c citizenRecordsFile.txt -b BloomSize
όπου citizenRecordsFile το αρχείο εγγραφών των πολιτών, όπως προέκυψε από το bash script, BloomSize το μέγεθος του bloom filter (τυπικά 100000)
ΕΠΕΞΗΓΗΣΕΙΣ ΥΛΟΠΟΙΗΣΗΣ :
Στα bloom.h, bloom.c υλοποιείται η δομή του bloom filter.
Το bloom filter υλοποιείται σαν ένας πίνακας 8-bit αριθμών, και όλες οι πράξεις πάνω σε αυτό, χρησιμοποιούν αριθμητική επιπέδου bit,
για να αλλάξουν συγκεκριμένα bits του πίνακα.
Στα list.h, list.c, υλοποιείται η δομή μιας απλής linked list, και κάποιων χρήσιμων συναρτήσεων σε λίστες.
Η απλή linked list χρειάστηκε, στην δομή του hash table, που χρησιμοποίησα σαν index για τις χώρες, ιούς, πολίτες.
Υποστηρίζονται διαφορετικά είδη κόμβων λίστας, μέσω void * δεικτών, ώστε να έχω λίστες και για citizen info, και για virus info,
και για country info.
Στα hash.h, hash.c υλοποιείται η δομής του hash-table, ως ενός πίνακα από λίστες.
Χρησιμοποιήθηκε για indexing πάνω στις χώρες, τους πολίτες, και τους ιούς.
Επίσης , το hash-table, υλοποιήθηκε να υποστηρίζει δυναμική επέκταση, με διπλασιασμό των buckets,
αν ο load factor υπερβεί κάποιο όριο.
Στα items.c, items.h, ορίζονται κάποια βασικά structs που χρησιμοποιήθηκαν στην εργασία, όπως ένα struct με
την πληροφορία ενός πολίτη , ένα struct με την πληροφορία ενός ιου (δλδ το bloom filter, και τα skip lists που σχετίζονται με τον ιο),
και ένα struct με την πληροφορία μιας χώρας. Αυτά τα structs, είναι στην ουσία η πληροφορία που αποθηκεύεται στα 3 hash tables
των πολιτών, ιών, χωρών αντίστοιχα, και όλες οι αναφορές μέσω συναρτήσεων (getters, setters) ή άλλων δομών κλπ γίνονται με δείκτες πάνω σε αυτές τις δομές,
ώστε να αποθηκεύεται όλη αυτή η πληροφορία μόνο μια φορά στη κυρία μνήμη, όπως και ζητείται.
Επιπλέον, ορίζονται εδώ και κάποιες utility functions που κάνουν date handling και σύγκριση ημερομηνιών.
Στα skip_list.c, skip_list.h, υλοποιείται η δομή της skip list και οι βασικές συναρτήσεις της.
Η κεντρική ιδέα της υλοποίησης, ήταν , ένας κόμβος της skip-list, να περιέχει στην ουσία, έναν πίνακα από δείκτες
σε άλλους κόμβους της skip-list, και με αυτόν τον τρόπο, να υλοποιείται αυτή η δομή των παράλληλων λιστών.
Κάθε κόμβος επίσης περιέχει και έναν δείκτη σε εγγραφή πολίτη, ώστε έτσι να αποφεύγεται η επανάληψη πληροφορίας.
Το ύψος του πίνακα κάθε κόμβου, καθορίζεται στην κατασκευή του, με συνεχόμενα coin tosses.
Στα monitor.h, monitor.c, υλοποιείται μία κεντρική δομή του monitor, η οποία ουσιαστικά λειτουργεί σαν τη δομή που
συνδυάζει όλες τις άλλες δομές σε μία. Ουσιαστικά αποτελείται από 3 hash tables, ένα για τους πολίτες, ένα για τους
ιούς, και ένα για τις χώρες, και όλες οι κεντρικές συναρτήσεις που ζητούνται, οι οποίες είναι επίσης υλοποιημένες εδώ,
προσπελαύνουν αυτά τα 3 hash-tables για να κάνουν τη δουλειά τους.
Δηλαδή, η ιδέα για την ιεραρχία των δομών, είναι η εξής :
στο υψηλότερο επίπεδο του χρήστη, βρίσκεται η δομή του monitor, του οποίου οι συναρτήσεις υλοποιούν τα ερωτήματα
η δομή του monitor με τη σειρά της, έχει 3 hashtables για να κρατάει αποδοτικά ένα index για τους πολίτες, τους ιούς, και τις χώρες της βάσης.
Το hashtable των πολιτών, περιέχει με τη σειρά του ένα πίνακα από λίστες που έχουν σαν κόμβους όλη την πληροφορία ενός πολίτη.
Το hashtable των χωρών, περιέχει με τη σειρά του ένα πίνακα από λίστες που έχουν σαν κόμβους όλη την πληροφορία μιας χώρας.
Το hashtable των ιών, περιέχει με τη σειρά του ένα πίνακα από λίστες που έχουν σαν κόμβους όλη την πληροφορία ενός ιού, δηλαδή
το bloom filter του ιού, και τις δύο skip list των vaccinated και non-vaccinated persons που σχετίζονται με τον ιό.
Και όλες οι αναφορές από δομές υψηλότερου επιπέδου σε δομές χαμηλότερου επιπέδου, γίνεται μέσω δεικτών, ώστε να αποφεύγεται το
data duplication.
Οι συναρτήσεις που υλοποιούν τα ζητούμενα της εργασίας, είναι λίγο πολύ προσαρμοσμένες σε όλες τις επεξηγήσεις που έχουν δοθεί στο piazza.
Απλά επίσης σε όλες τις συναρτήσεις εκτός από την insertCitizenRecord, υποθέτω ότι ο ιός και ο πολίτης υπάρχουν ήδη στη βάση,
και γίνεται και έλεγχος για αυτό.
Στο vaccineMonitor.c, βρίσκεται η main, που απλά ανοίγει το αρχείο των πολιτών, εισάγει τα δεδομένα στο monitor, και μετά δέχεται
είσοδο συμβολοσειρές από το χρήστη και καλεί την κατάλληλη συνάρτηση του monitor, που υλοποιεί το ζητούμενο.
Η είσοδος κάθε συμβολοσειράς γίνεται μετά το : "Waiting for command/task >> "