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



Σχετικά έγγραφα
εμφανίζονται σε ένα γράφημα που υλοποιείται από κλήση στην εφαρμογή gnuplot.

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

Προγραμματισμός συστημάτων UNIX/POSIX. Χρονομέτρηση

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

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

Kitchen Doormam. Floor with Tables. Restaurant Floorplan and Operation

fall2018/k22/home m1436+at-di.

Σημειώνουμε ότι τα αρχεία περιλαμβάνουν κανονικά αρχεία, καταλόγους και συνδέσμους (links). Οι αντίστοιχες εντολές είναι οι εξής:

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

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

an:3 are:6 a:10

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Προγραμματισμός συστημάτων UNIX/POSIX. Χρονομέτρηση, καθυστέρηση και ανάλυση επιδόσεων

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

50 Ketseo,Theoni Sarif,Omar 104

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

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

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

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Εισαγωγή στην Πληροφορική

Δομημένος Προγραμματισμός

Χρονοδρομολογητής Κυκλικής Επαναφοράς

Προγραμματισμός Η/Υ (ΤΛ2007 )

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Μεθόδων Επίλυσης Προβλημάτων

Εισαγωγή στο Flex. Μεταγλωττιστές, Χειμερινό εξάμηνο

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι (ΗΥ120)

Κεφάλαιο 4: Λογισμικό Συστήματος

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Προγραμματισμός συστημάτων UNIX/POSIX

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

Λιβανός Γιώργος Εξάμηνο 2017Β

Προγραμματισμός Η/Υ. Ενότητα 3: Top Down Σχεδιασμός

Εργαστήριο Λειτουργικών Συστημάτων Ακ. Έτος Άσκηση 3

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

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Η γλώσσα προγραμματισμού C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Η γλώσσα προγραμματισμού C

Πληροφορική 2. Δομές δεδομένων και αρχείων

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

ΤΕΛΙΚΟ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Συναρτήσεις. Εισαγωγή

Εισαγωγή στα Λειτουργικά Συστήματα (Λ/Σ) Το UNIX και οι εντολές του Παρουσίαση 3

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

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

12. Συναρτήσεις (Μέρος ΙI)

Ανάπτυξη και Σχεδίαση Λογισμικού

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Ηλεκτρονικοί Υπολογιστές

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Εισαγωγή στον Προγραμματισμό

Βασικές Αρχές Προγραμματισμού

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

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Ενδεικτικές λύσεις και στατιστικά

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

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

ΘΕΜΑΤΑ ΤΕΛΙΚΗΣ ΦΑΣΗΣ

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

Επαναληπτικές Διαδικασίες

Ηλεκτρονικοί Υπολογιστές

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Εισαγωγή στον Προγραμματισμό

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

Ταχύτερα compile με ccache και distcc

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

ΕΙΔΙΚΟΤΗΤΑ: ΤΕΧΝΙΚΟΣ ΕΦΑΡΜΟΓΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΜΑΘΗΜΑ: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Διαδιεργασιακή επικοινωνία (inter-process communication IPC) Προγραμματισμός II 1

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Ο πιο κάτω πίνακας περιγράφει σε ποιες περιπτώσεις χρησιμοποιούμε τους τρεις πιο πάνω τρόπους:

ΕΦΑΡΜΟΓΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Α ΤΑΞΗ

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ Τμήμα Πληροφορικής και Τηλεπικοινωνιών 2η Εργασία- Τμήμα Αρτίων Αριθμών Μητρώου Κ22: Λειτουργικά Συστήματα Χειμερινό Εξάμηνο 15 Ημερομηνία Ανακοίνωσης: 7 Νοεμβρίου Ημερομηνία Υποβολής: 30 Νοεμβρίου και Ωρα 23:59 Εισαγωγή στην Εργασία: Ο στόχος αυτής της εργασίας είναι να εξοικειωθείτε με την δημιουργία ιεραρχιών από διεργασίες χρησιμοποιώντας την κλήση συστήματος fork() που σε συνδυασμό με την κλήση exec*() μπορεί να βοηθήσει να επιτύχουμε διαφοροποίηση και επιμερισμό εργασίας. Το αρχικό σας πρόγραμμα μαζί με όλα τα παιδιά διεργασίες που θα δημιουργήσετε αποτελούν μία ιεραρχική δομή που στόχο έχει να καταμετρά τους ψήφους(δηλ. tally) που οι κάτοικοι μιας χώρας έχουν καταθέσει στα πλαίσια εκλογής προέδρου της δημοκρατίας. Η δενδρική δομή ταυτόχρονων προγραμμάτων διαθέτει το αρχικό σας πρόγραμμα(root), εσωτερικούς κόμβους που ονομάζονται splitters/mergers και τέλος κόμβους φύλλα που ονομάζονται sorters. Το δένδρο βοηθά ώστε να καταμετρηθούν σωστά οι ψήφοι των πολιτών οι οποίοι εμπεριέχονται σε ένα ASCII κείμενο τυχαίου μεγέθους(που μπορεί να είναι και εξαιρετικά μεγάλο). Στο εν λόγω αρχείο, η κάθε γραμμή παρουσιάζει την ανώνυμη επιλογή ενός πολίτη. Η ιεραρχία διασπά την καταμέτρηση σε πολλαπλές μικρότερες δουλειές και κατόπιν προχωρά στην σύνθεση των αποτελεσμάτων αλλά και στατιστικών που απαιτούνται. Στο τέλος, η εφαρμογή σας παρουσιάζει τα αποτελέσματα. Ο τρόπος με τον οποίο επιλύουμε το πρόβλημα καταμέτρησης ψήφων για την εκλογή προέδρου της Δημοκρατίας ακολουθεί την λογική του«διαίρει και κατέκτησε»: οι εσωτερικοί κόμβοι(splitters/mergers) αναθέτουν εργασία είτε σε υποκείμενους(splitters/mergers ή σε sorters). Από κάθε κόμβο διεργασίας μπορούν να δημιουργηθούν l παιδιά διεργασίες. Οι εργάτες(sorters) εμφανίζονται στο τελευταίο επίπεδο d της ιεραρχίας και είναι οι κατά βάσει υπεύθυνοι για την καταμέτρησή ψήφων από το τμήμα του αρχείου που τους αναλογεί. Τα αποτελέσματα περνούν από τους εργάτες στους γονείς τους όπου γίνεται σύνθεση αποτελεσμάτων και οι τελευταίοι επαναλαμβάνουν την ρουτίνα μέχρις έως ότου τα αποτελέσματα να ταξιδέψουν στον κόμβο root. Για τον παραπάνω σκοπό, οι ενδιάμεσοι κόμβοι και τα φύλλα της ιεραρχίας χρησιμοποιούν ανεξάρτητα(και διαφορετικά) προγράμματα για να επιτύχουν τον επιμέρους σκοπό τους. Οι επικοινωνίες μεταξύ κόμβων(δηλ. διεργασιών) σε διάφορα επίπεδα γίνεται με την χρήση είτε απλών pipes ή named-pipes (FIFOs). Σε αυτή την άσκηση: 1. θα δημιουργήσετε μια ιεραρχία διεργασιών χρησιμοποιώντας fork(), 2. θα εκτελέσετε διαφοροποιημένα κομμάτια κώδικα ή και ανεξάρτητα προγράμματα από τους κόμβους της ιεραρχίας, και 3. θα χρησιμοποιήσετε διάφορες κλήσεις συστήματος περιλαμβανομένων και των read(), write(), dup(), dup2(), mkfifo(), wait(), times(),κλπ. Διαδικαστικά: Τοπρόγραμμάσαςθαπρέπειναγραφτείσε C (ή C++ανθέλετεαλλάχωρίςτηνχρήση STL/Templates)και να τρέχει στις μηχανές Linux του τμήματος. Παρακολουθείτε την ιστοσελίδα του μαθήματος για επιπρόσθετες ανακοινώσεις στο URL http://www.di.uoa.gr/~ad/k22/. 1

Υπεύθυνοι για την άσκηση αυτή(ερωτήσεις, αξιολόγηση, βαθμολόγηση κλπ.) είναι οι κ. Ευάγγελος Νικολόπουλος e.nikolopoulos+at-di και Δημήτρης Μήλιος dmilios+at-di. Μέσα από την σελίδα https://piazza.com/uoa.gr/fall2015/k22sectiondelis/home θα μπορείτε να κάνετε ερωτήσεις και να δείτε απαντήσεις ή/και διευκρινήσεις που δίνονται σχετικά με την άσκηση(όπως έγινε με την πρώτη άσκηση). Η Ιεραρχία Διεργασιών: Το Σχήμα 1 δείχνει ένα παράδειγμα ιεραρχίας διεργασιών που θα πρέπει το πρόγραμμά σας να δημιουργήσει. Ο αριθμός των διαδικασιών-παιδιών που κάθε κόμβος μπορεί να δημιουργήσει(children) παραμένει σταθερό και δίνεται σαν παράμετρος(l) στο πρόγραμμά σας. Το Σχήμα 1 δίνει ένα τέτοιο παράδειγμα με ένα τριαδικό-δένδρο (turnary tree) όπου κάθε κόμβος έχει τρεις διαδικασίες-παιδιά. Ο κάθε κόμβος τρέχει ένα δικό του πρόγραμμα και επιτελεί μια επί μέρους δουλειά στην καταμέτρηση των ψήφων. Το βάθος του δένδρου των διαδικασιών ορίζεται από την παράμετρο d που επίσης παρέχεται στην γραμμή εντολής. Ο root κόμβος παρέχει στους ενδιάμεσους Coordinating Root Node root Level 0 Splitters/Mergers sm0 sm1 sm2 Level 1 Level 2 sm3 sm4 sm5 sm6 sm7 sm8 sm9 sm10 sm11 Level 3 Sorters S0 S1 S2 S3 S4 S5... s12 s13 s14... s24 s25 s26 Σχήμα1: ΙεραρχίαΔιεργασιώνμε l=3καιβάθος d=3. Οκάθεεργάτης(worker)δουλεύειμετο 1/27του αρχείου των ψήφων. splitters/mergers το εύρος γραμμών μέσα σε ένα αρχείο που οι τελευταίοι θα πρέπει να επεξεργαστούν και να δημιουργήσουν επί μέρους καταμετρήσεις(δηλ. για το συγκεκριμένο εύρος ψήφων ποιος είναι ο αριθμός ψήφων που έχει πάρει ο κάθε υποψήφιος). Οι ενδιάμεσοι κόμβοι του δένδρου έχουν ένα πολλαπλό ρόλο: 1) σπάνε το πρόβλημα της καταμέτρησης σε μικρότερα προβλήματα(splitting) και το προωθούν στους πιο κάτω κόμβους. Αυτό επαναλαμβάνεται μέχρι να φτάσουμε στο επίπεδο φύλλων(sorters), 2) προχωρούν στην σύνθεση των(μερικών) αποτελεσμάτων(merging) τα οποία προέρχονται από υποκείμενους κόμβους, και 3) προωθούν τα αποτελέσματα που έχουν συνθέσει στην διεργασία που είναι ή μητέρα τους. Οι κόμβοι-φύλλα ουσιαστικά ταξινομούν τους υποψηφίους και καταμετρούν τους ψήφους που κάθε υποψήφιος έχει λάβει. Μπορούν φυσικά, και θα πρέπει να κάνουν και οποιαδήποτε άλλη δουλειά ελαφρύνει την εργασία της ρίζας. Εν γένει, το πρόβλημα της καταμέτρησης«μεταφέρεται σταδιακά» στους κόμβους-φύλλα, όπου γίνεται η ουσια- 2

στική εργασία καταγραφής αποτελεσμάτων. Τα αποτελέσματα αυτά με την σειρά τους και επίσης με σταδιακό τρόπο«ανεβαίνουν» στην ιεραρχία μέχρι να φτάσουν στην ρίζα. Η ρίζα σαν διεργασία είναι υπεύθυνη για την τελική καταμέτρηση και την παρουσίαση των αποτελεσμάτων είτε σε μορφή απλής εξόδου κειμένου ή χρησιμοποιώντας ένα γράφημα. Η ρίζα, οι εσωτερικοί κόμβοι και τα φύλλα λειτουργούν με την βοήθειά τριών αυτόνομων, διαφορετικών προγραμμάτων. Κάθε φορά που υπάρχει ανάγκη να δημιουργηθεί ένα παιδί στην ιεραρχία μία κλήση fork() θα πρέπει να εκτελεστεί. Εάν ο χώρος μια διαδικασίας πρέπει να αντικατασταθεί με ένα άλλο εκτελέσιμο τότε αυτό επιτυγχάνεται με την κλήση μια exec*() της δικιά σας επιλογής που έχει και την σχετική λίστα παραμέτρων. Η λίστα αυτή μπορεί να περιέχει ότι πληροφορία είναι χρήσιμη για να δουλέψουν με επιτυχία οι κόμβοι τύπου splitter/merger(ενδιάμεσοι κόμβοι) και sorter(κόμβοι φύλλα). Τα παρακάτω σημεία δίνουν μια περιγραφή της λειτουργίας των διαφορετικών τύπων κόμβων και των ανεξαρτήτων προγραμμάτων που θα πρέπει να δημιουργήσετε ώστε να επιτευχθεί ο στόχος της άσκησης: 1. Οι τρεις τύποι κόμβων που αποτελούν την ιεραρχία εκτελούν ανεξάρτητα αλλά συνεργαζόμενα προγράμματα. 2. Ο κόμβος ρίζας(root) δηλ. το βασικό σας πρόγραμμα λειτουργεί σαν άγκυρα για όλη την ιεραρχία και διεκπεραιώνει την τελική παρουσίαση των αποτελεσμάτων. 3. Σύμφωνα με τον αριθμό l που έχει καθοριστεί στην γραμμή κλήσης του κυρίου προγράμματος, η ρίζα δημιουργεί l splitters/mergers. Ο κάθε splitter/merger παίρνει σαν είσοδο το 1/l των γραμμών του αρχείου κειμένου που θα πρέπει να επεξεργαστούμε. Η επεξεργασία που επιτελεί ο κάθε splitter/merger είναι η υποδιαίρεση της εργασίας, η προώθηση προς τα«κάτω», η συλλογή και σύνθεση αποτελεσμάτων από τους υποκείμενους κόμβους και τέλος η προώθηση των αποτελεσμάτων σε κόμβο γονιό. Οι ενδιάμεσοι κόμβοι βρίσκονται στα επίπεδα 1 μέχρι d 1 του δένδρου διεργασιών και όλοι επιτελούν την παραπάνω επεξεργασία. 4. Ο κάθε splitter/merger θα πρέπει να ανοίξει διόδους επικοινωνίας με όλους τους υποκείμενους κόμβους αλλά και τον υπερκείμενο κόμβο ώστε να περάσει(η να λάβει) σχετικές πληροφορίες/αποτελέσματα. Οι δίοδοι αυτοί υλοποιούνται είτε με απλά pipes ή με named pipes. 5. Οτανένας sorterολοκληρώσειτηνεργασίατουστέλνειένα USR1σήμα 1 ειδοποιώνταςέτσιτηνρίζαότι έχειολοκληρώσειτηνεργασίαπουτουαναλογεί.ανηρίζαλάβει l d τέτοιασήματαμπορείναολοκληρώσει την εργασία της προχωρώντας στον υπολογισμό στατιστικών και απεικονισμένων αποτελεσμάτων. Αν όμωςτελικάηρίζαλάβειλιγότερασήματααπό l d σήματα,απλάαναφέρειπόσαέχειλάβεικαιτερματίζει. 6. Ο κάθε splitter/merger ολοκληρώνει την εργασία του αφού συγκεντρώσει τα αποτελέσματά από τους υποκείμενους κόμβους, τα συνθέτει(merge) σε μια νέα ταξινομημένη λίστα(ή λίστες) αποτελεσμάτων την οποία αποστέλλει στο γονιό της. Επιπλέον ο κάθε splitter/merger και οι sorters αναφέρουν στον root το χρόνο που χρειάστηκαν για να ολοκληρώσουν την δουλειά τους. 7. Η ρίζα είναι υπεύθυνη να δημιουργήσει όλα τα αποτελέσματα σε απόλυτους αριθμούς(δηλ. πόσους ψήφους πήρε ο κάθε υποψήφιος και πόσοι είναι οι άκυρες ψήφοι), ποσοστώσεις καθώς επίσης και τα top εκλογικά τμήματα που δέχτηκαν«συνολικά» τουλάχιστον το p% των ψήφων. Το root τυπώνει τον αριθμό του σημάτων USR1 που έχει αποδεχτεί με επιτυχία όπως και τους χρόνους εκτέλεσης όλων των υποκείμενων 1 unreliable messaging 3

κόμβων. Τέλος,το rootπαράγειέναγράφημαμετηνβοήθειατου gnuplotδίνονταςέναγράφημαμετο ποσοστά επιτυχίας για τους υποψηφίους ταξινομημένα σε φθίνουσα σειρά επιτυχίας και τερματίζει. 8. Αν αντί για USR1 χρησιμοποιήστε SIGRTMIN+1 το αποτέλεσμα του αριθμού των σημάτων που μπορείτε να πάρετε στην ρίζα είναι διαφορετικός; Γιατί;(5 έξτρα πόντοι βαθμολογίας). Ολες οι διαδικασίες του Σχήματος 1 θα πρέπει να τρέχουν ταυτόχρονα και να προοδεύουν ασύγχρονα. Μια διεργασία γονιός μπορεί να δουλεύει με πολλαπλά named-pipes(η pipes) για να δέχεται τα επιμέρους αποτελέσματα. Γραμμή Κλήσης της Εφαρμογής: Η εφαρμογή μπορεί να κληθεί με τον παρακάτω τρόπο:./mytally -i TextFile -l numofsms -d Depth -p Percentile -o OutputFile όπου: mytally είναι το εκτελέσιμο της εφαρμογής που δημιουργεί την ιεραρχία διεργασιών και καλεί διαφορετικά προγράμματα, TextFile είναι το ASCII αρχείο με τα δεδομένα εισόδου(μία ψήφος ανά γραμμή), numofsms είναι ο αριθμός των κόμβων splitters/mergers που θα πρέπει να δημιουργηθούν από κάθε κόμβο, Depth είναι το βάθος του δένδρου που θα δημιουργηθεί, Percentile είναι το ποσοστό ψήφων που θα αποδώσουν τα top εκλογικά κέντρα, OutputFile το αρχείο που ο root να τυπώσει αποτελέσματα αν κάτι τέτοιο ζητηθεί. Οι σημαίες -i/-l/-d/-p/-o μπορούν να χρησιμοποιηθούν με οποιαδήποτε σειρά στην γραμμή εκτέλεσης του προγράμματος. Τα δεδομένα δίνονται σε ASCII μορφή σε ένα αρχείο. Κάθε γραμμή δεδομένων περιγράφει μια ανώνυμη ψήφο που έχει τα εξής στοιχεία:«επίθετο υποψηφίου, αριθμός εκλογικού τμήματος, έγκυρο/άκυρο». Τι πρέπει να Παραδοθεί: 1. Μια σύντομη και περιεκτική εξήγηση για τις επιλογές που έχετε κάνει στο σχεδιασμό του προγράμματος σας(1-2 σελίδες σε ASCII κειμένου είναι αρκετές). 2. Ενα Makefile(που να μπορεί να χρησιμοποιηθεί για να γίνει αυτόματα το compile του προγράμματος σας). 3. Ενα tar-fileμεόλησαςτηνδουλειάσεένανκατάλογοπουπιθανώςναφέρειτοόνομασαςκαιθαπεριέχει όλη σας την δουλειά δηλ. source files, header files, output files(αν υπάρχουν) και οτιδήποτε άλλο χρειάζεται. Άλλες Σημαντικές Παρατηρήσεις: 1. Οι εργασίες είναι ατομικές. 2. Τοπρόγραμμασαςθαπρέπεινατρέχεισε Linuxαλλιώςδενθαβαθμολογηθεί. 3. Ανκαιαναμένεταινασυζητήσετεμεφίλουςκαισυνεργάτεςτοπωςθαεπιχειρήσετεναδώσετελύσηστο πρόβλημα, αντιγραφή κώδικα(οποιαδήποτε μορφής) είναι κάτι που δεν επιτρέπεται και δεν πρέπει να γίνει. Οποιοσδήποτε βρεθεί αναμεμειγμένος σε αντιγραφή κώδικά απλά παίρνει μηδέν στο μάθημα. Αυτό ισχύει για όσους εμπλέκονται ανεξάρτητα από το ποιος έδωσε/πήρε κλπ. 4

4. Σε καμιά περίπτωση τα MS-Windows δεν είναι επιλέξιμη πλατφόρμα για την παρουσίαση αυτής της άσκησης. ΠΑΡΑΡΤΗΜΑ: Χρονισμός στο Unix: #include <stdio.h> /* printf() */ #include <sys/times.h> /* times() */ #include <unistd.h> /* sysconf() */ int main( void ) { double t1, t2, cpu_time; struct tms tb1, tb2; double ticspersec; int i, sum = 0; ticspersec = (double) sysconf(_sc_clk_tck); t1 = (double) times(&tb1); for (i = 0; i < 100000000; i++) sum += i; t2 = (double) times(&tb2); cpu_time = (double) ((tb2.tms_utime + tb2.tms_stime) - (tb1.tms_utime + tb1.tms_stime)); } printf("run time was %lf sec (REAL time) although we used the CPU for %lf sec (CPU time).\n", (t2 - t1) / ticspersec, cpu_time / ticspersec); 5