cgi.di.uoa.gr/~mema. Nikos Chondros, Panagiotis Diamantopoulos, Yannis Pappas, and Christos Patsonakis.

Σχετικά έγγραφα
50 Ketseo,Theoni Sarif,Omar 104

an:3 are:6 a:10

$./MirrorInitiator -n <MirrorServerAddress> -p <MirrorServerPort> \\ -s <ContentServerAddress1:ContentServerPort1:dirorfile1:delay1, \\

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο

waitpid(), read(), write(), pipe(), mkfifo() κ.α.).

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

Εισαγωγή. Interface της εφαρμογής. Κ24: Προγραμματισμός Συστήματος - 1η Εργασία, Εαρινό Εξάμηνο 2019 Προθεσμία Υποβολής: Παρασκευή 15 Μαρτίου, 23:59

HY-486 Αρχές Κατανεμημένου Υπολογισμού

2η Προγραµµατιστική Εργασία

./mydiz {-c -a -x -m -d -p -j} <archive-file> <list-of-files/dirs>

0 The quick brown fox leaped over the lazy lazy dog 1 Quick brown foxes leaped over lazy dogs for fun

ΧΑΡΟΚΟΠΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

wget --post-file meme.jpg :9646

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Kitchen Doormam. Floor with Tables. Restaurant Floorplan and Operation

Ειδικά Θέματα Προγραμματισμού

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Χειμερινό Εξάμηνο

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

fall2018/k22/home m1436+at-di.

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

Τη φυσική (MAC) διεύθυνση που δίνει ο κατασκευαστής του δικτυακού υλικού στις συσκευές του (π.χ. στις κάρτες δικτύου). Η περιοχή διευθύνσεων που

Εισαγωγή στην Επιστήμη της Πληροφορικής Εργαστήριο. UNIX Μέρος 1

Κατανεμημένα Συστήματα

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ Εαρινό Εξάμηνο

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα).

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ»

Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών

Τµήµα Πληροφορικής. Υλοποίηση LRU Cache ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ - ΕΡΓΑΣΙΑ 4. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Γενικά περί Caching

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 2. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 27/11/11, 22:00

FAIL PASS PASS οριακά

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

... s12 s13 s14. Σχήμα1: ΙεραρχίαΔιεργασιώνμε l=3καιβάθος d=3. Οκάθεεργάτης(worker)δουλεύειμετο 1/27του αρχείου των ψήφων.

Παράλληλη Επεξεργασία Εργαστηριακή Ασκηση Εαρινού Εξαµήνου 2008

Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Κεφάλαιο 5ο: Εντολές Επανάληψης

Πολυπύρηνοι επεξεργαστές Multicore processors

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

ΕΓΧΕΙΡΙΔΙΟ ΜΑΘΗΤΗ. της Πλατφόρμας Τηλεκατάρτισης

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10

ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ. Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26. Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M.

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

ΤΕΙ Κρήτης, Παράρτηµα Χανίων

ΤΡΙΩΡΗ ΓΡΑΠΤΗ ΔΟΚΙΜΑΣΙΑ

ΕΡΓΑΣΤΗΡΙΟ 1: 1 Εισαγωγή, Χρήσιμες Εφαρμογές

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Δυναμικός Κατακερματισμός. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

1. Δεν μπορεί να γίνει κλήση μίας διαδικασίας μέσα από μία συνάρτηση.

ABC3341, CCD2345, ,... CCDA2345, , ,00E

7.7 Πρωτόκολλο ARP. 1. Το πρωτόκολλο ARP μετατρέπει τις διευθύνσεις IP στις αντίστοιχες φυσικές. Σ Λ

Απαντήσεις. Απάντηση. Απάντηση

ιεργασίες και Επεξεργαστές στα Κατανεµηµένων Συστηµάτων

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

Μεταφορά Αρχείων µε χρήση της Υπηρεσίας FTP σελ. 1

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Αβδέλαρου Κωνσταντίνα

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 5/12/10, 23:59

Επεξεργασία Αρχείων Κειµένου

Εργαστήριο 9 Συναρτήσεις στη PASCAL. Η έννοια του κατακερματισμού. Συναρτήσεις. Σκοπός

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων


Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Λειτουργικά Συστήματα

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

lab7 PASS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. PASS -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου!

Άρα, Τ ser = (A 0 +B 0 +B 0 +A 0 ) επίπεδο 0 + (A 1 +B 1 +A 1 ) επίπεδο 1 + +(B 5 ) επίπεδο 5 = 25[χρονικές µονάδες]

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

7.2 Τεχνολογία TCP/IP

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Πέµπτη 17/12/2015, 22:00

Interactive Power Point

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΗ ΑΣΚΗΣΗ 2

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος Προγραμματιστική Εργασία - 2o Μέρος

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ Τµήµα Πληροφορικής και Τηλεπικοινωνιών Κ24: Προγραµµατισµός Συστήµατος Εαρινό Εξάµηνο 2013 2η Προγραµµατιστική Εργασία Ηµεροµηνία Ανακοίνωσης: 25/4/2013 Ηµεροµηνία Υποβολής: 30/5/2013 Εισαγωγή στην Εργασία Ο στόχος αυτής της εργασίας είναι να εξοικειωθείτε µε τον προγραµµατισµό συστήµατος σε Unix, και συγκεκριµένα µε την δηµιουργία νηµάτων και την δικτυακή επικοινωνία Θα υλοποιήσετε έναν ζεύγος προγραµµάτων (client και server) τα οποία θα φροντίζουν να συγχρονίζουν όλα τα αρχεία σε έναν κατάλογο από τον server προς τον client µε αποδοτικό τρόπο, τόσο όσον αφορά την δικτυακή επικοινωνία, όσο και την παραλληλία σε τοπικό και δικτυακό επίπεδο Συγκεκριµένα, το πρόγραµµα πελάτης θα συνδεθεί µε το πρόγραµµα-εξυπηρετητής και θα ζητήσει από το τελευταίο να υπολογίσει ένα hash-tree για κάθε αρχείο ενός συγκεκριµένου καταλόγου Ταυτόχρονα, και αυτό από την πλευρά του θα υπολογίζει τα αντίστοιχα hashtrees του δικού του αντίστοιχου καταλόγου Όταν λάβει σαν απάντηση τα αρχεία και τα hash-trees από τον εξυπηρετητή και έχει υπολογίσει και τα δικά του, θα τα συγκρίνει και θα ζητήσει από τον εξυπηρετητή µόνο τις σελίδες που έχουν διαφορές Όταν τις λάβει, θα ενηµερώσει τα αρχεία του ιαδικαστικά: Το πρόγραµµά σας θα πρέπει να τρέχει στα µηχανήµατα Linux της σχολής Για επιπρόσθετες ανακοινώσεις, παρακολουθείτε τη λίστα του µαθήµατος και το URL: cgidiuoagr/~mema Υπεύθυνοι για την άσκηση αυτή (ερωτήσεις, αξιολόγηση, βαθµολόγηση, κτλ) είναι οι: Nikos Chondros, Panagiotis Diamantopoulos, Yannis Pappas, and Christos Patsonakis Email θα βρείτε στην ιστοσελίδα του µαθήµατος Εγγραφείτε στην ηλεκτρονική λίστα (mailman) του µαθήµατος και παρακολουθείτε ερωτήσεις/απαντήσεις/διευκρινήσεις που δίνονται σχετικά µε την άσκηση (σηµείωση: η η-λίστα αυτή δεν έχει καµία σχέση µε την hard-copy λίστα που κυκλοφορησε στα πρώτα µαθήµατα και στην οποία θα έπρεπε να γράψετε το όνοµά σας και το Unix user-id σας) Τι πρέπει να παραδοθεί: 1 Όλη η δουλειά σας σε ένα tar-file που να περιέχει όλα τα source files, header files, makefile ΠΡΟΣΟΧΗ: φροντίστε να φτιάξετε τα δικαιώµατα αυτού του αρχείου πριν την υποβολή, πχ µε chmod 755 OnomaEponymoProject1tar (περισσότερα στη σελίδα του µαθήµατος) 2 Μια σύντοµη περιγραφή (2-3 σελίδες) για τις επιλογές που κάνατε στο σχεδιασµό της άσκησης, σε µορφή PDF 3 Οποιαδήποτε πηγή πληροφορίας, συµπεριλαµβανοµένου και κώδικα που µπορεί να βρήκατε στο ιαδίκτυο θα πρέπει να αναφερθεί και στον πηγαίο κώδικά σας αλλά και

στην παραπάνω αναφορά Υπόβαθρο Hash-Trees Ισχύει η εισαγωγή της πρώτης εργασίας σχετικά µε συναρτήσεις κατακερµατισµού και δέντρα κατακερµατισµού Αυτή τη φορά όµως, το χτίσιµο του δέντρου είναι πολύ απλούστερο Τα δέντρα θα είναι σταθερού µεγέθους, αφού ύψος και fan-out ορίζονται από παραµέτρους Έστω λοιπόν δέντρο ύψους height, όπου num_levels=height+1 Για να φτιαχτεί ένα hash-tree σταθερού µεγέθους, που αντιπροσωπεύει ένα αρχείο µε αυτή τη λογική, αρκεί η εξής διαδικασία (το σύµβολο ^ σηµαίνει στη δύναµη ): for i = 0 height level[i] = allocate memory for fanout^i elements page=0 while not end of file //iterate through every page of the file read page_data (remeber to pad the last with zeroes) level[height][page]=hash(page_data) page++ while page < fanout^(height) //fill the rest with hash of blank page level[height][page] = hash(blank_page) page++ Έχοντας τα φύλλα, κάνετε ένα πέρασµα προς τα πάνω για να συµπληρώσετε και όλα τα εσωτερικά digests µέχρι το root: level=height 1 while level >= 0 for i = 0 fanout^level-1 //for each node in this level levels[level][i] = hash of elements: levels[level+1][fanout*i] up to but not including levels[level+1][fanout*(i+1)] level-- Στο τέλος, το levels[0][0] είναι το root digest που αντιπροσωπεύει όλο το δέντρο Αλγόριθµος σύγκρισης ταξινοµηµένων σειρών αρχείων Επίσης θα χρειαστείτε έναν αλγόριθµο που συγκρίνει δύο ταξινοµηµένες σειρές αρχείων και αποφασίζει τις ενέργειες που πρέπει να εφαρµόσει για να τα συγχρονίσει Έστω λοιπόν πίνακες source[] και target[] µε ονόµατα αρχείων Ο παρακάτω αλγόριθµος θα τα συγχρονίσει µε ένα πέρασµα στον source[] (όπου #πίνακας εννοεί το πλήθος των στοιχείων του): isource=itarget=0 while isource < #source while itarget < #target and target[itarget] < source[isource] delete file target[itarget] from target path itarget++

if itarget < #target and target[itarget] == source[isource] compare the contents of the two files and syncronize itarget++ else copy file source[isource] to target path isource++ Αναλυτική περιγραφή Θέµα 1: Server, Μονάδες 60 *** Αναπτύξτε την εφαρµογή filesyncd, η οποία θα εξυπηρετεί πολλαπλές συνδέσεις από πελάτες, έτσι ώστε να τους δίνει τη δυνατότητα να συγχρονίσουν έναν κατάλογο την φορά µε τον αντίστοιχο στον server Η σύνταξη θα είναι: filesynd <port> <thread_pool_size> <queue_size> <tree_height> <tree_fanout> Όπου: port: Το port στο οποίο θα ακούει για εξωτερικές συνδέσεις thread_pool_size: Ο αριθµός των worker threads στο thread pool queue_size: Το µέγεθος της ουράς ενδοεπικοινωνίας tree_height: το (σταθερό) ύψος του hash-tree tree_fanout: το (σταθερό) fan-out του hash-tree Η εφαρµογή θα εξυπηρετεί πολλαπλούς πελάτες µέσω multiplexing σε ένα thread (µέσω select/poll/epoll) και θα µοιράζει την πραγµατική εργασία σε ένα thread pool Όλη η δικτυακή επικοινωνία µε τους πελάτες θα γίνεται από ένα και µόνο thread (απαγορεύονται λύσεις thread-per-socket) Όταν λάβει οποιοδήποτε µήνυµα από πελάτη του δικτύου, θα το προωθήσει σε κάποιο από τα worker threads για να το υλοποιήσει Όταν το worker-thread τελειώσει, θα στείλει το αποτέλεσµα πίσω στο κυρίως thread, το οποίο µε τη σειρά του θα το προωθήσει στον πελάτη Για την προώθηση µηνυµάτων προς το thread pool, θα χρησιµοποιήσετε µια δοµή τύπου ουράς (queue), υλοποιώντας µια σχέση producer/consumer Για την προώθηση απαντήσεων από το thread pool προς το main thread, µπορείτε να χρησιµοποιήσετε είτε sockets τύπου AF_INET (όπου το listening side θα ακούει µόνο στο loopback interface), είτε sockets τύπου AF_UNIX Ένα διάγραµµα που δείχνει την επιθυµητή διάταξη του server είναι το ακόλουθο:

Πελάτης Πελάτης External socket Internall socket Server Main Thread Server Worker Thread Queue Server Worker Thread Τα µηνύµατα θα είναι τα ακόλουθα: Μήνυµα Κατεύθυνση C=Client S=Server W=Worker thread Περιγραφή GETFILES <directory> C->S, S->W Αιτείται τα στοιχεία των αρχείων του καταλόγου <directory> EXPECT <num> W->S, S->C Ενηµερώνει τον πελάτη πόσα αρχεία να περιµένει (δηλαδή µηνύµατα FILEINFO) PROCESSFILE <directory> <filename> FILEINFO <filename> <filesize> <hash-tree> GETDATA <directory> <filename> <pageno> DATA <filename> <pageno> <pagedata> S->W W->S, S->C C->S, S->W W->S, S->C Αιτείται την ανάγνωση του αρχείου και τη δηµιουργία του hash-tree Ενηµερώνει τον πελάτη µε τα απαραίτητα στοιχεία για τον συγχρονισµό ενός αρχείου Αιτείται µια συγκεκριµένη σελίδα ενός αρχείου από τον εξυπηρετητή Μεταφέρει στον πελάτη τα δεδοµένα µιας σελίδας ενός αρχείου ERROR <message> W->S, S->C Μήνυµα λάθους το οποίο αποστέλλει ένα thread σε οποιαδήποτε περίπτωση λάθους, µε το ανάλογο µήνυµα

Έτσι, όταν ληφθεί ένα µήνυµα GETFILES, προωθείται άµεσα στο queue του thread pool Ένα από τα threads θα το αναλάβει, και θα ανατρέξει στον δοθέντα κατάλογο για να βρει όλα τα αρχεία που περιλαµβάνει Για κάθε ένα που θα βρει, θα προωθήσει στο queue του thread pool ένα µήνυµα <PROCESSFILE> για να γίνει η ανάγνωσή του Τέλος, θα στείλει ένα µήνυµα EXPECT στο πελάτη (µέσω του main thread πάντα) έτσι ώστε να τον ενηµερώσει πόσα FILEINFO µηνύµατα να περιµένει Σηµειώστε ότι το µέγεθος σελίδας για αυτή την άσκηση είναι σταθερό και ίσο µε 4 Kb (4096 (bytes Σηµειώστε επίσης ότι, για να στείλει ένα µήνυµα το κυρίως thread του server σε έναν πελάτη, θα πρέπει να ξέρει για ποιον πελάτη πρόκειται! Άρα, το main thread θα πρέπει να εµπλουτίζει ένα µήνυµα µε αυτήν την πληροφορία πριν το τοποθετήσει στο queue για το thread pool Τα worker threads θα εκτελούν τελικά µια από τις παρακάτω λειτουργίες: Μήνυµα Λειτουργία GETFILES <directory> PROCESSFILE <directory> <filename> GETDATA <directory> <filename> <pageno> Ψάχνει στον συγκεκριµένο κατάλογο για όλα τα αρχεία Προωθεί από ένα PROCESSFILE µήνυµα για το καθένα στο queue του thread pool Τέλος στέλνει ένα µήνυµα EXPECT στο main thread για να το προωθήσει στον πελάτη Βρίσκει το µέγεθος του αρχείου και στη συνέχεια φτιάχνει το hashtree που το συνοψίζει Στέλνει ένα µήνυµα FILEINFO µε αυτά τα στοιχεία στο main thread για να το προωθήσει στον πελάτη ιαβάζει την συγκεκριµένη σελίδα του αρχείου και στέλνει ένα µήνυµα DATA µε αυτά τα στοιχεία στο main thread για να το προωθήσει στον πελάτη Θέµα 2:Client, Μονάδες 40 *** Η δεύτερη εφαρµογή που καλείστε να αναπτύξετε είναι το αντίστοιχο πρόγραµµα πελάτη (filesync) το οποίο θα επικοινωνεί µε τον εξυπηρετητή µε σκοπό να συγχρονίσει τα περιεχόµενα ενός τοπικού του καταλόγου Η κλήση του προγράµµατος από την γραµµή εντολών θα έχει ως εξής: /filesync <server_ip> <server_port> <thread_pool_size> <queue_size> <tree height> <tree fan-out> <directory-name> Όπου: server_ip: Η διεύθυνση IP που χρησιµοποιεί ο εξυπηρετητής server_port: Η πόρτα που χρησιµοποιεί ο εξυπηρετητής thread_pool_size: Ο αριθµός των worker threads στο thread pool queue_size: Το µέγεθος της ουράς ενδοεπικοινωνίας για τα worker threads tree_height: το (σταθερό) ύψος του hash-tree tree_fanout: το (σταθερό) fan-out του hash-tree directory-name: το όνοµα του καταλόγου τον οποίο θα συγχρονίσει το filesync Το ζητούµενο εδώ είναι να κερδίσουµε χρόνο µέσω παραλληλίας σε δύο επίπεδα:

1 Ο client θα πρέπει να χρησιµοποιήσει πολλά νήµατα για να διαβάσει τα στοιχεία των (τοπικών) αρχείων 2 Ο client θα πρέπει να ζητήσει από τον server να του δώσει τα στοιχεία των (αποµακρυσµένων) αρχείων χωρίς να περιµένει πρώτα να τελειώσει η δική του επεξεργασία Το πρόγραµµα πελάτης λοιπόν εκκινεί την εκτέλεση του διαβάζοντας και επαληθεύοντας τις τιµές των παραµέτρων που έλαβε από την γραµµή εντολών Στη συνέχεια αρχικοποιεί µια ουρά µηνυµάτων (message-queue) την οποία και θα χρησιµοποιήσει για την επικοινωνία µεταξύ των threads Τέλος, δηµιουργεί τόσα νήµατα όσα ορίζει η παράµετρος <thread_pool_size> Το αρχικό νήµα, δηλαδή αυτό που δηµιούργησε όλα τα υπόλοιπα, θα το ονοµάσουµε το κύριο νήµα (main thread), ενώ τα υπόλοιπα νήµατα εργάτες (worker threads) Τα νήµατα εργάτες θα περιµένουν µηνύµατα από το queue (σχέση παραγωγού-καταναλωτή, producer-consumer), όπου τον ρόλο του παραγωγού τον αναλαµβάνει το κύριο νήµα και τον ρόλο του καταναλωτή τον αναλαµβάνουν τα νήµατα εργάτες Συνεπώς, σε αυτό το στάδιο του προγράµµατος, η διεργασία filesync αποτελείται από <thread_pool_size>+1 νήµατα συνολικά Έπειτα, το κύριο νήµα, ανοίγει και διαβάζει τα περιεχόµενα του καταλόγου που έλαβε σαν όρισµα από την γραµµή εντολών Οι κλήσεις συστήµατος που θα χρησιµοποιήσετε για αυτήν την λειτουργία ανήκουν στην οικογένεια που ορίζεται στο αρχείο-επικεφαλίδα direnth και σας είναι ήδη γνωστές από τις διαφάνειες του µαθήµατος Ο σκοπός είναι για κάθε καταχώρηση του καταλόγου (όνοµα αρχείου) να δηµιουργηθεί ένα δέντρο κατακερµατισµού από τα περιεχόµενα του αρχείου, ένα έργο το οποίο θα διεκπεραιωθεί από τα νήµατα εργάτες Για το σκοπό αυτό, το κύριο νήµα δηµιουργεί µία αίτηση CALCULATE_HASH <filename> την οποία την τοποθετεί στην ουρά αιτήσεων Αυτό το γεγονός έχει σαν αποτέλεσµα να ξυπνήσει (ξεµπλοκάρει) ένα νήµα εργάτη το οποίο θα αναλάβει να την εξυπηρετήσει (δες παρακάτω για το τι θα κάνει) Σε αυτό το σηµείο τα νήµατα-εργάτες είναι ελεύθερα και αυτόνοµα για να επεξεργαστούν τα δεδοµένα των ζητούµενων αρχείων (παραλληλία) Όταν ένα νήµα εργάτης παραλάβει µία αίτηση CALCULATE_HASH, εκκινεί τον υπολογισµό ενός δέντρου κατακερµατισµού από τα περιεχόµενα του αρχείου που του υποδεικνύει Κάθε νήµα εργάτης, όταν ολοκληρώσει τον υπολογισµό ενός δέντρου κατακερµατισµού, το τοποθετεί σε µία διαµοιραζόµενη λίστα η οποία συγκεντρώνει τα αποτελέσµατα όλων των νηµάτων εργατών Τα περιεχόµενα της λίστας αυτής πρέπει να είναι ταξινοµηµένα βάση του ονόµατος του αρχείου, κάτι το οποίο µπορείτε να φροντίσετε κατά την εισαγωγή στη λίστα Επιστρέφοντας στην λειτουργία του κύριου νήµατος, ενώ αυτό διαβάζει τις καταχωρήσεις του καταλόγου, υπάρχει περίπτωση, εκείνη την χρονική στιγµή, όλα τα νήµατα εργάτες να είναι ήδη απασχοληµένα µε τον υπολογισµό δέντρων κατακερµατισµού Σε αυτήν την περίπτωση, το κύριο νήµα δεν θα αναστείλει την λειτουργία του περιµένοντας τα νήµατα εργάτες να τελειώσουν µε το έργο τους, αλλά θα τοποθετήσει την αίτηση στην διαµοιραζόµενη ουρά και θα συνεχίσει µε την επόµενη (αν υπάρχει) καταχώρηση του καταλόγου κανονικά Συνεπώς, µετά το πέρας της ανάγνωσης των περιεχοµένων του καταλόγου από το κύριο νήµα, κατά πάσα πιθανότητα θα εκκρεµούν ακόµη αρκετές αιτήσεις

CALCULATE_HASH Χωρίς να περιµένει αυτές να τελειώσουν, το κύριο νήµα επιχειρεί να ανοίξει µία TCP σύνδεση µε τον εξυπηρετητή Όταν συνδεθεί µε επιτυχία µε τον εξυπηρετητή του αποστέλλει µήνυµα GETFILES <directory-name>, δηλώνοντας έτσι στον εξυπηρετητή πως επιθυµεί να συγχρονίσει τα περιεχόµενα του τοπικού του καταλόγου <directory-name> µε αυτά που βρίσκονται αποµακρυσµένα στον εξυπηρετητή Το πρόγραµµα του εξυπηρετητή, µε την παραλαβή ενός τέτοιου µηνύµατος, θα απαντήσει µε τα εξής: EXPECT <n> FILEINFO <name 1,size 1,hash_tree 1 > FILEINFO <name 2,size 2,hash_tree 2 > FILEINFO <name n,size n,hash_tree n > Το µήνυµα EXPECT <n> δηλώνει στον πελάτη, ουσιαστικά, πόσα αρχεία περιέχει ο κατάλογος Για κάθε αρχείο του καταλόγου, ο εξυπηρετητής αποστέλλει ένα µήνυµα τύπου FILEINFO το οποίο περιέχει µία τριπλέτα που περιλαµβάνει το όνοµα, το µέγεθος και το σειριοποιηµένο (serialized) δέντρο κατακερµατισµού για ένα αρχείο του καταλόγου Σηµειώστε σε αυτό το σηµείο ότι το µήνυµα EXPECT µπορεί να µην έρθει πρώτο, λόγω της παράλληλης επεξεργασίας στην πλευρά του server Σε ακραία περίπτωση, θα µπορούσαµε να έχουµε ακόµη και το εξής: FILEINFO <name 1,size 1,hash_tree 1 > FILEINFO <name n,size n,hash_tree n > FILEINFO <name 2,size 2,hash_tree 2 > EXPECT <n> Συνεπώς, το πρόγραµµα πελάτης, µετά την επιτυχή αποστολή ενός GETFILES µηνύµατος, εισέρχεται σε έναν βρόγχο στον οποίο περιµένει να διαβάσει την απάντηση από τον εξυπηρετητή µε στόχο να χτίσει την λίστα-αρχείων-εξυπηρετητή Αν υποθέσουµε ότι όλα βαίνουν καλώς και ο πελάτης λάβει πρώτα το µήνυµα EXPECT, τότε είναι σε θέση να γνωρίζει ακριβώς πόσα µηνύµατα FILEINFO θα διαβάσει στην συνέχεια Όµως, επειδή, όπως προείπαµε, υπάρχει περίπτωση τα µηνύµατα να ληφθούν ανακατεµένα, ο πελάτης θα πρέπει να είναι σε θέση να χειριστεί αυτήν την περίπτωση Συνεπώς, ενώ λαµβάνει FILEINFO µηνύµατα και δεν έχει λάβει το µήνυµα EXPECT, τα αποθηκεύει ούτως ή άλλως στην λίστα-αρχείων-εξυπηρετητή και συνεχίζει µε την επόµενη ανάγνωση Όταν τελικά λάβει το µήνυµα EXPECT είναι σε θέση πλέον να γνωρίζει πόσα και αν θα ακολουθήσουν άλλα FILEINFO µηνύµατα Όταν δεν υπάρχουν άλλα διαθέσιµα µηνύµατα, ο πελάτης προχωρά στο επόµενο βήµα της εκτέλεσής του Σηµειώστε ότι και αυτή η λίστα θα πρέπει να είναι ταξινοµηµένη, κάτι το οποίο µπορείτε και πάλι να φροντίσετε κατά την εισαγωγή Σε αυτό το σηµείο, το κύριο νήµα ελέγχει αν όλα τα νήµατα εργάτες έχουν ολοκληρώσει το

έργο τους Σε περίπτωση που κάποιο/α είναι ακόµα απασχοληµένα, τώρα και µόνον τώρα θα περιµένει να τερµατίσουν Με αυτόν τον τρόπο έχουµε πετύχει την επικάλυψη του τοπικού υπολογισµού των δέντρων κατακερµατισµού µε την δικτυακή επικοινωνία µε τον εξυπηρετητή µέσω της παραλληλίας Όταν όλα τα νήµατα εργάτες τερµατίσουν την λειτουργία τους, τότε το κύριο νήµα εισέρχεται στο στάδιο συγχρονισµού των περιεχοµένων του φακέλου Στα πλαίσια αυτής της περιγραφής θα θεωρήσουµε ότι η κατάσταση των φακέλων στον πελάτη και στον εξυπηρετητή είναι αυτή του παρακάτω σχήµατος Server (filesyncd): directory/ file1 file3 file4 Client (filesync): directory/ file1 file2 file3 Σχήµα 1: Περιεχόµενα του υπό συγχρονισµού καταλόγου µε όνοµα directory στην πλευρά του πελάτη και του εξυπηρετητή Το αρχείο file3 υπάρχει και είναι το ίδιο και απαράλλαχτο, το file1 υπάρχει και στις δύο πλευρές αλλά, τόσο τα περιεχόµενά του, όσο και το µέγεθός του ή και τα δύο, διαφέρουν Το file2 υπάρχει µόνο στην πλευρά του πελάτη και αντιστοίχως, το file4, µόνο στην πλευρά του εξυπηρετητή Σε αυτό το στάδιο της εκτέλεσής του, το κύριο νήµα έχει στην διάθεσή του δύο λίστες Η πρώτη περιέχει καταχωρήσεις που αφορούν τον τοπικό του κατάλογο ενώ η δεύτερη περιέχει τις καταχωρήσεις στην πλευρά του εξυπηρετητή Για να συγχρονιστούν τα περιεχόµενα των φακέλων πρέπει: 1 Να δηµιουργηθούν όλα τα αρχεία που υπάρχουν στην δεύτερη λίστα και δεν υπάρχουν στην πρώτη Σε αυτήν την περίπτωση το πρόγραµµα πελάτης θα εκτυπώνει στην οθόνη µήνυµα: Creating file <filename> with size <size> 2 Να διαγραφούν όλα τα αρχεία που υπάρχουν στην πρώτη και δεν υπάρχουν στην δεύτερη Σε αυτήν την περίπτωση το πρόγραµµα πελάτης θα εκτυπώνει στην οθόνη µήνυµα: Deleting file <filename> 3 Να συγκριθούν τα αρχεία που εµφανίζονται και στις δύο λίστες χρησιµοποιώντας τον αλγόριθµο σύγκρισης των δέντρων Merkle που µάθατε στην 1 η εργασία Σε αυτήν την περίπτωση το πρόγραµµα πελάτης θα εκτυπώνει στην οθόνη µήνυµα: File <filename> client and server versions differ in page <page_number>, για κάθε

σελίδα στην οποία τα περιεχόµενα του αρχείου <filename> διαφέρουν Στο υπόβαθρο σας έχει δοθεί ένας αλγόριθµος που υλοποιεί τα παραπάνω σε ένα πέρασµα Χρησιµοποιώντας την παραπάνω µεθοδολογία καθίσταται εφικτό το πρόγραµµα πελάτης να ζητήσει από τον εξυπηρετητή µόνο τις σελίδες δεδοµένων που χρειάζεται, περιορίζοντας έτσι το δικτυακό κόστος επικοινωνίας Το πρόγραµµα πελάτης λοιπόν θα ζητήσει µία-µία όλες τις σελίδες δεδοµένων από τον εξυπηρετητή µε την αποστολή GETDATΑ µηνυµάτων Σηµειώστε ότι θα πρέπει να χρησιµοποιήσετε το πεδίο µέγεθος αρχείου έτσι ώστε, και να ζητήσετε σελίδες µόνο στο πραγµατικό εύρος δεδοµένων του αρχείου, αλλά και να θέσετε το σωστό µέγεθος αρχείου µετά τον συγχρονισµό (δες ftruncate) Μετά το πέρας αυτής της διαδικασίας, τα περιεχόµενα του καταλόγου έχουν συγχρονιστεί µε επιτυχία και το πρόγραµµα πελάτης τερµατίζει την λειτουργία του εκτυπώνοντας µήνυµα επιτυχίας Θέµα 3 (Extra credit), Μονάδες 20 *** Προσέξτε ότι το τελικό στάδιο του προγράµµατος client είναι απολύτως σειριακό Η ροή δεδοµένων είναι η εξής: Αποστολή αίτησης για σελίδα δεδοµένων στον server (write to socket) <Αναµονή απάντησης: κόστος δικτυακής επικοινωνίας> Αίτηση εγγραφής δεδοµένων στο δίσκο (write to file) <Αναµονή ολοκλήρωσης: κόστος εγγραφής σε δίσκο> Και αυτό επαναλαµβάνεται για κάθε σελίδα κάθε αρχείου που πρέπει να έρθει από τον server Είναι προφανές ότι αυτές οι αναµονές θα µπορούσαν να επικαλυφθούν µε επεξεργασία, αν: 1 Υπήρχε σταθερή ροή αιτήσεων σελίδων προς το δίκτυο, χωρίς αναµονή για πρότερη απάντηση (δες πρωτόκολλα επανεκποµπής, στόχος η αποφυγή του Stop-And-Wait και της τραγικά µικρής δικτυακής απόδοσης που επιφέρει) 2 Η ροή αιτήσεων εγγραφής δεδοµένων στον δίσκο ήταν σταθερή και επικάλυπτε την αναµονή απάντησης από το δίκτυο Σχεδιάστε και εφαρµόστε µια λύση στο παραπάνω πρόβληµα Hint: A socket can safely be read from one thread and written to by another thread (that is, two threads need no further synchronization if one is only reading from a socket and the other is only writing to it) ιαδικαστικά Επισηµάνσεις/Παραδοχές: Υποθέστε ότι ο κατάλογος για συγχρονισµό µπορεί να είναι µόνο άµεσος υπόκατάλογος του τρέχοντος καταλόγου, τόσο για τον client όσο και για τον server Υποθέστε ότι δεν υπάρχουν hard/soft links, όπως και υποκατάλογοι στους καταλόγους για συγχρονισµό Υποθέστε ότι τα αρχεία στον server δεν αλλάζουν για όλη τη διάρκεια ζωής του προγράµµατος server Θα πρέπει να δώσετε µια καλή λύση στην οριοθέτηση µηνυµάτων στο κανάλι (see: message framing for TCP socket) Θα πρέπει να γνωρίζετε που αρχίζει και που τελειώνει ένα µήνυµα, και να µπορείτε να µεταφέρετε οποιαδήποτε πληροφορία

µεταβλητού µεγέθους χωρίς περιορισµούς όσον αφορά τους χαρακτήρες που περιλαµβάνονται Θα πρέπει να διαχειριστείτε κατάλληλα την περίπτωση που η µια πλευρά κλείνει την σύνδεση (SIGPIPE/EPIPE) Θα εκτιµηθεί περισσότερο µια λύση που σέβεται το γεγονός ότι ο client και ο server µπορεί να τρέχουν σε πλατφόρµες διαφορετικής αρχιτεκτονικής (χρήση htonx, ntohx) Συνεχίζοντας µε το παραπάνω, η ενδοεπικοινωνία µε sockets όµως δεν έχει τέτοιους περιορισµούς Μάλιστα, επειδή εγγυηµένα στην περίπτωσή µας τα δύο άκρα είναι στην ίδια διεργασία, µπορείτε να µεταφέρετε ακόµη και δείκτες µέσω αυτής Η σύγκριση των hash-trees θα πρέπει να γίνει από τη ρίζα προς τα κάτω και όχι φύλλο-φύλλο Οποιαδήποτε καλύτερη λύση για την ταξινόµηση των λιστών µε τα ονόµατα αρχείων είναι ευπρόσδεκτη Εννοείτε ότι περιµένουµε αµυντικό προγραµµατισµό (έλεγχο λαθών) σε όλα τα επίπεδα (από τις παραµέτρους των προγραµµάτων µέχρι την ορθότητα των δικτυακών µηνυµάτων) Τι θα βαθµολογηθεί: 1 Η συµµόρφωση του κώδικά σας µε τις προδιαγραφές της άσκησης 2 Η οργάνωση και η αναγνωσιµότητα (µαζί µε την ύπαρξη σχολίων) του κώδικα 3 Η χρήση Makefile και η κοµµατιαστή σύµβολο-µετάφραση (separate compilation) 4 Η αναφορά που θα γράψετε και θα υποβάλετε µαζί µε τον πηγαίο κώδικα σε µορφή PDF Άλλες σηµαντικές παρατηρήσεις: 1 Οι εργασίες είναι ατοµικές 2 Όποιος υποβάλλει / δείχνει κώδικα που δεν έχει γραφτεί από την ίδια/τον ίδιο µηδενίζεται στο µάθηµα 3 Αν και αναµένεται να συζητήσετε µε φίλους και συνεργάτες το πως θα επιχειρήσετε να δώσετε λύση στο πρόβληµα, αντιγραφή κώδικα (οποιασδήποτε µορφής) είναι κάτι που δεν επιτρέπεται και δεν πρέπει να γίνει Οποιοσδήποτε βρεθεί αναµεµειγµένος σε αντιγραφή κώδικα απλά παίρνει µηδέν στο µάθηµα Αυτό ισχύει για όλους όσους εµπλέκονται, ανεξάρτητα από το ποιος έδωσε/πήρε κλπ 4 Το πρόγραµµά σας θα πρέπει να γραφτεί σε C (ή C++ χωρίς όµως STL extensions) και θα πρέπει να τρέχει σε Ubuntu-Linux, αλλιώς δεν θα βαθµολογηθεί 5 Σε καµία περίπτωση τα MS-Windows δεν είναι επιλογή πλατφόρµας για την παρουσίαση αυτής της άσκησης