ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Χρονοδρομολόγηση Παράλληλων Εργασιών σε Κατανεμημένα Συστήματα Προσομοίωση και Εκτίμηση της Απόδοσης ιπλωµατική Εργασία Επιµέλεια Συγγραφή: ΗΜΗΤΡΙΑ ΟΥ ΣΟΦΙΑ 891 Υπεύθυνη Καθηγήτρια Καρατζά Ελένη ΙΟΥΝΙΟΣ 2007
Περιεχόµενα Πρόλογος 3 Κεφάλαιο 1 ο Εισαγωγή 4 1.1 Γενικά για την Προσοµοίωση. 4 1.2 Κατηγορίες Συστηµάτων. 5 1.3 Τα Είδη Μοντέλων Προσοµοίωσης. 6 1.4 Ο Μηχανισµός Εξέλιξης του Χρόνου.. 8 1.5 Οργάνωση ενός Μοντέλου Προσοµοίωσης 9 1.6 Τα Βήµατα µιας Μελέτης µε Προσοµοίωση 11 1.7 Πλεονεκτήµατα και Μειονεκτήµατα 12 1.8 Προβλήµατα / υσκολίες της Προσοµοίωσης. 14 Κεφάλαιο 2 ο Ανάλυση του Συστήµατος 15 2.1 Ουρές αναµονής. 15 2.2 Κατανεµηµένα συστήµατα.. 15 2.3 Περιγραφή του συστήµατος 16 2.4 Χαρακτηριστικά / Παραδοχές του συστήµατος. 17 2.5 Η διαδικασία των αφίξεων.. 19 2.6 Η επιλογή της ουράς... 21 2.7 Χρονοδροµολόγηση των διεργασιών.. 23 2.7.1 First Come First Served (FCFS) 23 2.7.2 Shortest Task First (STF).. 24 2.7.3 Παράδειγµα χρονοδροµολόγησης. 25 2.8 Μετρικές απόδοσης του συστήµατος.. 27 Κεφάλαιο 3 ο Σχεδίαση του Συστήµατος 29 3.1 Περιπτώσεις Χρήσης.. 29 3.1.1 Άφιξη νέου job στο σύστηµα 30 3.1.2 Εισαγωγή του job στην ουρά αναµονής 31 3.1.3 Ολοκλήρωση της εξυπηρέτησης (Αναχώρηση) 32 3.2 ιαχείριση των γεγονότων 33 3.3 Ο µηχανισµός εξέλιξης του χρόνου. 35 3.4 ηµιουργία τυχαίων παρατηρήσεων 37 1
Κεφάλαιο 4 ο Υλοποίηση του Συστήµατος 38 4.1 Λεπτοµέρειες Υλοποίησης 38 4.2 ιάγραµµα κλάσεων. 40 4.3 Τεκµηρίωση του πηγαίου κώδικα. 41 4.1.1 class Job.. 41 4.1.2 class Task... 42 4.1.3 class Queue. 44 4.1.4 class Event.. 46 4.1.5 class EventList 47 4.1.6 class Generator 48 4.1.7 class Simulation.. 49 4.1.8 class Statistics..52 4.4 Είσοδος / Έξοδος του συστήµατος.. 54 Κεφάλαιο 5 ο Πειραµατισµός και Ανάλυση της Απόδοσης 60 5.1 1 η Σειρά Πειραµάτων. 61 5.1.1 Πείραµα 1 α. 61 5.1.2 Πείραµα 1β. 63 5.1.3 Πείραµα 1γ. 65 5.2 2 η Σειρά Πειραµάτων.. 67 5.2.1 Πείραµα 2α.. 67 5.2.2 Πείραµα 2β. 69 5.2.3 Πείραµα 2γ.. 71 5.3 3 η Σειρά Πειραµάτων.. 73 5.3.1 Πείραµα 3α.. 73 5.3.2 Πείραµα 3β. 76 5.4 Συµπεράσµατα 78 Παράρτηµα Πηγαίος Κώδικας Βασικών Κλάσεων 79 Βιβλιογραφικές Πηγές Υποστηρικτικό Υλικό.. 84 2
Πρόλογος Η παρούσα διπλωµατική εργασία εκπονήθηκε στο πλαίσιο του Προπτυχιακού Προγράµµατος Σπουδών του Αριστοτέλειου Πανεπιστηµίου Θεσσαλονίκης και η ανάθεση έγινε από την αναπληρώτρια καθηγήτρια κα. Ελένη Καρατζά. Το αντικείµενο της µελέτης είναι η χρονοδροµολόγηση παράλληλων εργασιών σε κατανεµηµένα συστήµατα και η εκτίµηση της απόδοσης µε προσοµοίωση. Στο πρώτο κεφάλαιο γίνεται µια εισαγωγή στην έννοια της προσοµοίωσης. ίνεται ο ορισµός της, αναλύονται τα είδη των µοντέλων της και αναφέρονται τα πλεονεκτήµατα και τα µειονεκτήµατα αυτής. Στο δεύτερο κεφάλαιο παρουσιάζονται τα βασικά χαρακτηριστικά του συστήµατος. Το τρίτο κεφάλαιο αναφέρεται στη σχεδίαση του συστήµατος και περιγράφει τους αλγόριθµους που θα πρέπει να εφαρµοστούν για την υλοποίηση του. Το τέταρτο κεφάλαιο περιλαµβάνει την τεκµηρίωση του πηγαίου κώδικα του προγράµµατος. Τέλος, στο πέµπτο και τελευταίο κεφάλαιο διεξάγεται µια σειρά πειραµάτων για την εκτίµηση της απόδοσης του συστήµατος, όπου γίνεται ανάλυση των αποτελεσµάτων και παρουσίαση των συµπερασµάτων. Θα ήθελα να ευχαριστήσω θερµά την επιβλέπουσα καθηγήτρια της εργασίας, κα. Ελένη Καρατζά για την εµπιστοσύνη που µου έδειξε και για την πολύτιµη βοήθεια και καθοδήγηση που µου προσέφερε καθ όλη τη διάρκεια της εκπόνησης της. Αφιερώνω την εργασία αυτή στους πολυαγαπηµένους µου γονείς, Κωνσταντίνο και Μαρία και στον Χρήστο που µε στήριξαν οικονοµικά, αλλά πρωτίστως ψυχολογικά µε την υποµονή, την κατανόηση και την αγάπη τους όλα αυτά τα χρόνια. 3
Κεφάλαιο 1 ο Εισαγωγή 1.1 Γενικά για την Προσοµοίωση Προσοµοίωση (simulation) είναι η µίµηση της λειτουργίας συστηµάτων ή της εξέλιξης διαδικασιών µέσα στο χρόνο µε τη βοήθεια υπολογιστή. Αποτελεί πειραµατική µέθοδο που έχει σα σκοπό τη βελτιστοποίηση ενός συστήµατος, τη µελέτη της λειτουργίας του και την ανάλυση της ευαισθησίας του. Ως πειραµατική µέθοδος όµως, εξαρτάται πολύ από την πιστότητα του µοντέλου που χρησιµοποιείται (καθορισµός παραµέτρων Μοντελοποίηση) ιαδικασία ή σύστηµα ονοµάζεται ένα σύνολο στοιχείων τα οποία εξελίσσονται και αλληλεπιδρούν σύµφωνα µε κάποιους κανόνες. Οι κανόνες αυτοί εκφράζονται µε µαθηµατικές ή λογικές σχέσεις, και αποτελούν το µοντέλο του συστήµατος. Κατάσταση είναι το σύνολο των µεταβλητών οι οποίες δίνουν την απαραίτητη πληροφορία για την περιγραφή του συστήµατος. Αν οι σχέσεις που περιγράφουν την εξέλιξη του συστήµατος είναι απλές, τότε είναι δυνατή η εύρεση λύσεων κλειστής µορφής, οπότε λέµε ότι το µοντέλο επιλύεται αναλυτικά. Ωστόσο τα περισσότερα συστήµατα έχουν διάνυσµα κατάστασης µεγάλων διαστάσεων και περιγράφονται από πολύπλοκα µοντέλα των οποίων η αναλυτική επίλυση είναι αδύνατη. Για τη µελέτη τους εφαρµόζονται οι λεγόµενες αριθµητικές µέθοδοι. Τέτοιες είναι η αριθµητική ανάλυση και η προσοµοίωση. Η προσοµοίωση συνίσταται στην ανάπτυξη ενός µοντέλου του υπό εξέταση συστήµατος µε τη µορφή προγράµµατος σε υπολογιστή και στην εκτέλεση ενός (ή περισσοτέρων) πειράµατος το οποίο καταγράφει την κατάσταση του συστήµατος σε διαδοχικές χρονικές στιγµές αποτυπώνοντας ένα πιθανό σενάριο εξέλιξης του συστήµατος στο χρόνο. Η προσοµοίωση ευρίσκει εφαρµογές: στην ανάλυση και σχεδίαση συστηµάτων παραγωγής (βιοµηχανία) στον έλεγχο αποθεµάτων (βιοµηχανία, εµπορικές επιχειρήσεις) στη µελέτη κυκλοφοριακών συστηµάτων (οδικό δίκτυο, αεροδρόµια) στη µελέτη συστηµάτων εξυπηρετήσεως πελατών (τράπεζες, νοσοκοµεία, τηλεπικοινωνίες) στην αξιολόγηση αποφάσεων υπό αβεβαιότητα (χρηµατιστήριο, επενδύσεις, marketing). Με την µοντελοποίηση και προσοµοίωση µπορεί κανείς να αξιολογήσει την αποτελεσµατικότητα ή απόδοση ενός συστήµατος πριν αυτό κατασκευασθεί µε σκοπό τη βέλτιστη σχεδίασή του. 4
1.2 Κατηγορίες Συστηµάτων Ανάλογα µε το αν παρουσιάζουν διαχρονική εξέλιξη, τα συστήµατα διακρίνονται σε δυναµικά και στατικά (dynamic / static). υναµικό είναι το σύστηµα του οποίου η κατάσταση είναι συνάρτηση του χρόνου. Στατικό, αντίθετα, είναι το σύστηµα το οποίο δεν εµφανίζει εξέλιξη (δεν µεταβάλλεται) µε την πάροδο του χρόνου. Ενα εκκρεµές στη θέση ισορροπίας, το αποτέλεσµα της ρίψης ενός νοµίσµατος, ένα σύστηµα εξισώσεων, είναι στατικά συστήµατα. Τα δυναµικά συστήµατα διακρίνονται σε συστήµατα διακριτού χρόνου (discretetime systems), συστήµατα συνεχούς χρόνου (continuous-time systems). Στα συστήµατα διακριτού χρόνου η κατάσταση µεταβάλλεται βηµατικά (απότοµα) σε διακριτές χρονικές στιγµές t1, t2, t3,..., ενώ παραµένει σταθερή στα διαστήµατα [t1,t2),[t2, t3),... Συνεχές είναι το σύστηµα του οποίου η κατάσταση είναι συνεχής συνάρτηση του χρόνου. Η διαχρονική συµπεριφορά συνεχών συστηµάτων περιγράφεται συνήθως από διαφορικές εξισώσεις. Το επόµενο σχήµα δείχνει τους τρόπους µε τους οποίους µπορεί κανείς να µελετήσει τη λειτουργία ενός συστήµατος. Σχήµα 1.1 Οι τρόποι µελέτης ενός συστήµατος 5
1.3 Τα Είδη Μοντέλων Προσοµοίωσης Έχοντας ένα µαθηµατικό µοντέλο που πρέπει να µελετήσουµε µε προσοµοίωση (δηλαδή ένα Μοντέλο Προσοµοίωσης), θα πρέπει να αναζητήσουµε κατάλληλα εργαλεία για το σκοπό αυτό. Στην προσπάθεια αυτή, είναι χρήσιµο να ταξινοµήσουµε τα Μοντέλα Προσοµοίωσης µε βάση τέσσερις διαφορετικές έννοιες: 1. Στατικά ή Δυναμικά Μοντέλα Προσομοίωσης Ένα στατικό µοντέλο προσοµοίωσης, αναπαριστά ένα σύστηµα σε µία συγκεκριµένη χρονική στιγµή, ή αναπαριστά ένα σύστηµα στο οποίο ο χρόνος δεν έχει σηµασία. Αντίθετα, ένα δυναµικό µοντέλο προσοµοίωσης αναπαριστά ένα σύστηµα, όπως αυτό εξελίσσεται µε την πάροδο του χρόνου. 2. Ντετερμινιστικά ή Στοχαστικά Μοντέλα Προσομοίωσης Αν ένα µοντέλο προσοµοίωσης δεν περιλαµβάνει πιθανοτικά (δηλαδή "τυχαία") τµήµατα, ονοµάζεται ντετερµινιστικό. Για παράδειγµα, ένα πολύπλοκο σύστηµα διαφορικών εξισώσεων που περιγράφει µία χηµική αντίδραση, µπορεί να είναι ένα τέτοιο µοντέλο. Στα ντετερµινιστικά µοντέλα, η έξοδος είναι καθορισµένη, µε δεδοµένο το σύνολο των ποσοτήτων και σχέσεων εισόδου του µοντέλου. Όµως, πολλά συστήµατα πρέπει να χρησιµοποιήσουν στοχαστικά µοντέλα προσοµοίωσης, δηλαδή µοντέλα που θα έχουν τουλάχιστον ορισµένα τµήµατα µε "τυχαία" είσοδο. Τα περισσότερα υπολογιστικά συστήµατα, που βασίζονται στα συστήµατα αναµονής (queueing systems), χρησιµοποιούν στοχαστικά µοντέλα προσοµοίωσης. 3. Αυτο-οδηγούμενα ή Ιχνο-οδηγούμενα Μοντέλα Προσομοίωσης Σε ένα αυτο-οδηγούµενο (self-driven) µοντέλο, υπάρχει µία εσωτερική πηγή τυχαίων αριθµών. Οι τυχαίοι αριθµοί οδηγούν τα τµήµατα του µοντέλου, δηλαδή χρησιµοποιούνται για τον προσδιορισµό των στιγµών εµφανίσεων των γεγονότων του συστήµατος. Το βασικό χαρακτηριστικό του αυτοοδηγούµενου µοντέλου είναι ότι αποτελεί ένα αυτάρκες µοντέλο το οποίο δεν χρειάζεται εξωτερικές εισόδους (inputs) για να λειτουργήσει. Αντίθετα, ένα ιχνο-οδηγούµενο (trace-driven) µοντέλο καθοδηγείται από ακολουθίες εισόδου που προέρχονται από δεδοµένα (trace data) που έχουν δηµιουργηθεί από τη λειτουργία ενός πραγµατικού συστήµατος. Τέτοια δεδοµένα µπορούν να παραχθούν στα περισσότερα υπολογιστικά συστήµατα που διαθέτουν ενσωµατωµένα προγράµµατα ιχνηλάτησης (tracing programs) που παρακολουθούν και καταγράφουν τις δραστηριότητες του συστήµατος. Τα ιχνο-οδηγούµενα µοντέλα έχουν ορισµένα πλεονεκτήµατα, όπως το γεγονός ότι αποφεύγονται οι δυσκολίες της πιθανοτικής ανάλυσης που χρειάζεται για τη χρήση κατανοµών στην περιγραφή των εισόδων του µοντέλου και επίσης το γεγονός ότι τα µοντέλα αυτά είναι εύκολο να επιβεβαιωθούν. Το 6
πρόβληµα µε τα ιχνο-οδηγούµενα µοντέλα είναι το µικρό εύρος εφαρµογών που µπορούν να αντιµετωπίσουν. Οι εφαρµογές αυτές πρακτικά περιορίζονται σε υπολογιστικά συστήµατα και µάλιστα µόνο για τη µελέτη µετατροπών σε ένα σύστηµα που ήδη λειτουργεί. 4. Συνεχή ή Διακριτά Μοντέλα Προσομοίωσης: Οι ορισµοί των συνεχών και διακριτών µοντέλων προσοµοίωσης, είναι ανάλογοι µε τους ορισµούς των συνεχών και διακριτών συστηµάτων που αναφέρθηκαν στην παράγραφο 1.2. Πάντως, πρέπει να σηµειωθεί ότι ένα διακριτό µοντέλο δεν χρησιµοποιείται µόνο για την αναπαράσταση ενός διακριτού συστήµατος και ένα διακριτό σύστηµα δεν αναπαριστάται µόνο από ένα διακριτό µοντέλο προσοµοίωσης. Η απόφαση για τη χρήση ενός διακριτού ή ενός συνεχούς µοντέλου για ένα συγκεκριµένο σύστηµα, εξαρτάται από τους ιδιαίτερους στόχους της µελέτης. Για παράδειγµα, ένα µοντέλο της ροής πακέτων δεδοµένων σε ένα WAN, θα είναι διακριτό εάν µας ενδιαφέρουν τα χαρακτηριστικά και η κίνηση των επιµέρους πακέτων και κατά συνέπεια των επιµέρους χρηστών. Αντίθετα, αν µας ενδιαφέρει µόνο η συνολική κίνηση, η ροή των πακέτων θα µπορούσε ίσως να περιγραφεί µε διαφορικές εξισώσεις σε ένα συνεχές µοντέλο. Το µοντέλο προσοµοίωσης που θα µας απασχολήσει στη συνέχεια, θα είναι διακριτό, δυναµικό, στοχαστικό και αυτο-οδηγούµενο και θα ονοµάζεται Μοντέλο Προσοµοίωσης ιακριτών Γεγονότων (discrete event simulation models). Μάλιστα, αφού τα ντετερµινιστικά µοντέλα µπορούν να θεωρηθούν ειδικές περιπτώσεις των στοχαστικών µοντέλων, δεν θα έχουµε απώλεια της γενικότητας στη µελέτη των µοντέλων προσοµοίωσης. 7
1.4 Ο Μηχανισµός Εξέλιξης του Χρόνου Λόγω του δυναµικού χαρακτήρα των µοντέλων προσοµοίωσης διακριτών γεγονότων, πρέπει να έχουµε τη δυνατότητα αποθήκευσης της τρέχουσας τιµής του προσοµοιωµένου χρόνου, ενώ χρειαζόµαστε και ένα µηχανισµό αύξησής του από µία τιµή σε µία άλλη. Η µεταβλητή του µοντέλου προσοµοίωσης που µας δίνει την τρέχουσα τιµή του χρόνου, ονοµάζεται ρολόι προσοµοίωσης (simulation clock) ( [1] ). Η µονάδα χρόνου που χρησιµοποιεί το ρολόι είναι συνήθως η ίδια µε αυτή που χρησιµοποιούν οι παράµετροι εισόδου, ενώ γενικά δεν υπάρχει σχέση του χρόνου που καταγράφει το ρολόι, µε το χρόνο που απαιτείται για την εκτέλεση του προσοµοιωτή στον υπολογιστή. Ιστορικά έχουν επικρατήσει δύο βασικές µέθοδοι για την εξέλιξη του ρολογιού προσοµοίωσης: Η Εξέλιξη µε βάση το Χρόνο του Εποµένου Γεγονότος (nextevent time advance) και η Εξέλιξη Σταθερής Αύξησης του Χρόνου (fixedincrement time advance). Θα χρησιµοποιήσουµε την πρώτη µέθοδο διότι είναι πιο διαδεδοµένη και διότι η δεύτερη µπορεί να θεωρηθεί ειδική περίπτωση της πρώτης. Στη µέθοδο εξέλιξης µε βάση το χρόνο του εποµένου γεγονότος, το ρολόι προσοµοίωσης αρχικοποιείται στο µηδέν και καθορίζονται οι στιγµές εµφάνισης των µελλοντικών γεγονότων. Το ρολόι τότε αυξάνει στο χρόνο εµφάνισης του πιο κοντινού στο µέλλον, από τα γεγονότα αυτά. Τη στιγµή αυτή η κατάσταση του συστήµατος ενηµερώνεται ώστε να πάρει υπ όψη της το γεγονός που εµφανίστηκε, ενώ ενηµερώνεται επίσης η γνώση µας για τις χρονικές στιγµές εµφάνισης των µελλοντικών γεγονότων. Στη συνέχεια, το ρολόι αυξάνει ώστε να δείχνει τη στιγµή εµφάνισης του νέου πιο κοντινού στο µέλλον γεγονότος, η κατάσταση του συστήµατος ενηµερώνεται, καθορίζονται οι χρονικές στιγµές εµφάνισης των µελλοντικών γεγονότων κ.ο.κ. Η διαδικασία αυτή εξέλιξης του ρολογιού προσοµοίωσης από το ένα γεγονός στο άλλο, συνεχίζεται µέχρι να ικανοποιηθεί κάποια προκαθορισµένη συνθήκη τερµατισµού της προσοµοίωσης. Αφού όλες οι αλλαγές κατάστασης γίνονται µόνο στις χρονικές στιγµές εµφάνισης των γεγονότων, οι ενδιάµεσες ανενεργοί περίοδοι δεν λαµβάνονται υπ όψη και το ρολόι µετακινείται αυτόµατα στη στιγµή εµφάνισης του εποµένου γεγονότος. Όσον δε αφορά τη µέθοδο εξέλιξης σταθερής αύξησης του χρόνου, το ρολόι προσοµοίωσης εξελίσσεται µε σταθερές αυξήσεις ακριβώς t µονάδων χρόνου κάθε φορά. Μετά από κάθε ενηµέρωση του ρολογιού, γίνεται ένας έλεγχος για να εξακριβωθεί εάν θα έπρεπε να έχουν εµφανισθεί κάποια γεγονότα κατά το προηγούµενο χρονικό διάστηµα t. Αν εµφανίσθηκαν γεγονότα στο διάστηµα αυτό, θεωρούµε ότι αυτά εµφανίζονται στο τέλος του χρονικού διαστήµατος και η κατάσταση του συστήµατος ενηµερώνεται κατάλληλα. 8
1.5 Οργάνωση ενός Μοντέλου Προσοµοίωσης Τα περισσότερα µοντέλα προσοµοίωσης διακριτών γεγονότων που χρησιµοποιούν τη µέθοδο εξέλιξης µε βάση το χρόνο του εποµένου γεγονότος, περιλαµβάνουν τα παρακάτω τµήµατα: Κατάσταση Συστήµατος (system state): Η συλλογή των µεταβλητών κατάστασης που είναι απαραίτητες για την περιγραφή του συστήµατος σε µία χρονική στιγµή. Ρολόι Προσοµοίωσης (simulation clock): Μία µεταβλητή που περιέχει την τρέχουσα τιµή του προσοµοιωµένου χρόνου. Λίστα Γεγονότων (event list): Μία λίστα που περιέχει την επόµενη χρονική στιγµή εµφάνισης κάθε τύπου γεγονότος. Στατιστικοί Μετρητές (statistical counters): Μεταβλητές που χρησιµοποιούνται για την αποθήκευση στατιστικών µετρήσεων της απόδοσης του συστήµατος. Ρουτίνα Έναρξης (initialization routine): Ένα υποπρόγραµµα που αρχικοποιεί το µοντέλο προσοµοίωσης τη χρονική στιγµή µηδέν. Ρουτίνα Χρόνου (timing routine): Ένα υποπρόγραµµα που αναγνωρίζει το επόµενο γεγονός από τη λίστα γεγονότων και ακολούθως αυξάνει το ρολόι προσοµοίωσης στη χρονική στιγµή που το γεγονός αυτό θα εµφανισθεί. Ρουτίνες Γεγονότων (event routines): Υποπρογράµµατα που ενηµερώνουν την κατάσταση συστήµατος όταν εµφανίζεται ένα συγκεκριµένο είδος γεγονότος (υπάρχει µία τέτοια ρουτίνα για κάθε είδος γεγονότος). Ρουτίνες Βιβλιοθήκης (library routines): Σύνολο υποπρογραµµάτων που δηµιουργούν τυχαίες εµφανίσεις τιµών από πιθανοτικές κατανοµές, που έχουν ορισθεί ως µέρος του µοντέλου προσοµοίωσης. Ρουτίνα Αποτελεσµάτων (report generator): Υποπρόγραµµα που υπολογίζει εκτιµήσεις των επιθυµητών µέτρων απόδοσης από τους µετρητές στατιστικών και παράγει αναφορές όταν τελειώσει η εκτέλεση του προσοµοιωτή. Κυρίως Πρόγραµµα (main program): Το πρόγραµµα που καλεί τη ρουτίνα χρονισµού για να καθοριστεί το επόµενο γεγονός και µετά µεταφέρει τον έλεγχο στην αντίστοιχη ρουτίνα γεγονότος για να ενηµερωθεί κατάλληλα η κατάσταση του συστήµατος. Ελέγχει επίσης αν πρέπει να τερµατισθεί η προσοµοίωση και καλεί τότε τη γεννήτρια αναφορών. 9
Οι λογικές σχέσεις ανάµεσα στα παραπάνω τµήµατα φαίνονται στο παρακάτω σχήµα. Σχήµα 1.2 Μοντέλο προσοµοίωσης διακριτών γεγονότων 10
1.6 Τα Βήµατα µιας Μελέτης µε Προσοµοίωση Στο επόµενο σχήµα παρουσιάζονται τα βήµατα που ακολουθεί µία τυπική µελέτη ενός συστήµατος µε χρήση προσοµοίωσης. Σχήµα 1.3 Τα βήµατα µελέτης µε προσοµοίωση 11
1.7 Πλεονεκτήµατα και Μειονεκτήµατα Η προσοµοίωση είναι µια ευρέως χρησιµοποιούµενη και συνεχώς πιο δηµοφιλής µέθοδος για τη µελέτη πολύπλοκων συστηµάτων. Έχει φυσικά τα πλεονεκτήµατα, τα µειονεκτήµατά της, αλλά και υπάρχουν πολλές αιτίες εξ αιτίας των οποίων ορισµένες προσοµοιώσεις δεν καταλήγουν στο επιθυµητό αποτέλεσµα. Πλεονεκτήματα Ορισµένα πιθανά πλεονεκτήµατα της χρήσης της µεθόδου της προσοµοίωσης είναι τα παρακάτω: Τα περισσότερα σύνθετα συστήµατα του πραγµατικού κόσµου µε "τυχαίες" παραµέτρους, δεν µπορούν να περιγραφούν ικανοποιητικά µε κάποιο µαθηµατικό µοντέλο που µπορεί να λυθεί αναλυτικά. Έτσι, η προσοµοίωση είναι συχνά η µόνη διαθέσιµη µέθοδος µελέτης. Η προσοµοίωση επιτρέπει την εκτίµηση της απόδοσης ενός υπάρχοντος συστήµατος, κάτω από κάποιο προβλεπόµενο σύνολο λειτουργικών συνθηκών. Μπορούν να συγκριθούν µέσω της προσοµοίωσης, εναλλακτικές προτεινόµενες σχεδιάσεις ή εναλλακτικές πολιτικές λειτουργίας του συστήµατος, ώστε να προσδιορισθεί η βέλτιστη λύση που ικανοποιεί τις προδιαγραφές που έχουν ορισθεί. Σε ένα µοντέλο προσοµοίωσης µπορούµε να έχουµε καλύτερο έλεγχο στις συνθήκες των πειραµάτων, σε σχέση µε πιθανό πειραµατισµό µε το πραγµατικό σύστηµα. Η προσοµοίωση επιτρέπει τη µελέτη ενός συστήµατος που έχει µακρόχρονη εξέλιξη (π.χ. ένα οικονοµικό σύστηµα), σε πολύ µικρότερο χρόνο, ή τη µελέτη της λεπτοµέρειάς του σε περισσότερο χρόνο. Είναι µια µέθοδος οικονοµική, αφού είναι δυνατό να υλοποιηθεί πλέον σε µικρούς υπολογιστές µε τη χρήση γλωσσών προγραµµατισµού γενικού σκοπού όπως η C, η Pascal και η BASIC. Η προσοµοίωση µπορεί να υλοποιηθεί από µηχανικούς που δεν είναι απαραίτητο να έχουν εκτεταµένες µαθηµατικές γνώσεις, παρά µόνο τη δυνατότητα να κατανοούν βασικές έννοιες στατιστικής και να µπορούν να εφαρµόζουν ήδη έτοιµα µαθηµατικά εργαλεία. 12
Μειονεκτήματα Ορισµένα µειονεκτήµατα της προσοµοίωσης είναι τα παρακάτω: Κάθε εκτέλεση ενός µοντέλου προσοµοίωσης διακριτών γεγονότων παράγει µόνο εκτιµήσεις των πραγµατικών χαρακτηριστικών του µοντέλου, για ένα συγκεκριµένο σύνολο παραµέτρων εισόδου. Έτσι, είναι πιθανό να χρειασθούν πολλές διαφορετικές ανεξάρτητες εκτελέσεις του µοντέλου για κάθε σύνολο παραµέτρων εισόδου που θα µελετηθεί. Για το λόγο αυτό, η προσοµοίωση δεν είναι γενικά τόσο καλή µέθοδος για βελτιστοποίηση, όσο είναι για τη σύγκριση εναλλακτικών σχεδιαστικών λύσεων του συστήµατος. Τα µοντέλα προσοµοίωσης συχνά απαιτούν πολύ χρόνο και πόρους για να αναπτυχθούν. Ο µεγάλος όγκος αριθµών που παράγονται από µία µελέτη προσοµοίωσης ή η εντύπωση που δηµιουργούν οι τυχόν γραφικές αναπαραστάσεις των αποτελεσµάτων της, συχνά ενισχύουν µία τάση να δίνεται µεγαλύτερη εµπιστοσύνη στα αποτελέσµατα αυτά από όσο πρέπει. Αν το µοντέλο δεν είναι µία αρκετά έγκυρη αναπαράσταση του συστήµατος, τα αποτελέσµατα της προσοµοίωσης, ανεξάρτητα του πόσο εντυπωσιακά είναι, θα προσθέσουν λίγη χρήσιµη πληροφορία για το πραγµατικό σύστηµα. 13
1.8 Προβλήµατα / υσκολίες της Προσοµοίωσης Από τη στιγµή που έχει ληφθεί η απόφαση να χρησιµοποιηθεί προσοµοίωση για τη µελέτη ενός συστήµατος, έχει παρατηρηθεί ότι µπορούν να εµφανισθούν αρκετά προβλήµατα στην πορεία υλοποίησης ενός επιτυχηµένου προσοµοιωτή: Όχι καλά ορισµένοι στόχοι κατά την έναρξη της µελέτης. Ακατάλληλο επίπεδο λεπτοµέρειας του µοντέλου. Χειρισµός της µελέτης µε προσοµοίωση, σαν να ήταν βασικά µία δύσκολη άσκηση προγραµµατισµού. Έλλειψη στοιχειωδών γνώσεων Επιχειρησιακής Έρευνας και Στατιστικής. Χρήση εµπορικών πακέτων προσοµοιωτών που µπορεί να περιέχουν λάθη ή να µην υλοποιούν τη λογική του συστήµατος. Αποτυχία στη σωστή καταγραφή των πηγών τυχαιότητας του συστήµατος. Χρήση αυθαίρετων κατανοµών (π.χ. κανονική ή οµοιόµορφη) για την περιγραφή των εισόδων του προσοµοιωτή. Ανάλυση των δεδοµένων εξόδου από µία εκτέλεση του προσοµοιωτή, µε τη χρήση στατιστικών τύπων που προϋποθέτουν ανεξαρτησία. Χρήση λανθασµένων µέτρων απόδοσης. 14
Κεφάλαιο 2 ο Ανάλυση του Συστήματος 2.1 Ουρές Αναµονής Μια ουρά αναµονής ή ισοδύναµα ένα σύστηµα εξυπηρέτησης είναι ένα µαθηµατικό πρότυπο για τη µοντελοποίηση ενός πραγµατικού συστήµατος εισόδου - εξόδου µονάδων (πελατών) στο οποίο υπεισέρχεται τυχαιότητα. Τυπικά παραδείγµατα ουρών αναµονής που παρουσιάζονται στις εφαρµογές είναι τα ταµεία των τραπεζών και γενικότερα διαφόρων οργανισµών, τα τηλεφωνικά κέντρα εξυπηρέτησης πελατών, το τηλεφωνικό δίκτυο, το διαδίκτυο καθώς και τοπικά δίκτυα υπολογιστών, οι γραµµές παραγωγής µιας βιοµηχανικής µονάδας, συγκοινωνιακά δίκτυα κλπ. Στόχος της θεωρία των ουρών αναµονής είναι η ποσοτική περιγραφή τέτοιων συστηµάτων και ο βέλτιστος σχεδιασµός τους. To υπό µελέτη σύστηµα είναι ένα κατανεµηµένο σύστηµα ουρών αναµονής. 2.2 Τα κατανεµηµένα συστήµατα Ένα κατανεµηµένο σύστηµα είναι µια συλλογή από ανεξάρτητους υπολογιστές το οποίο φαίνεται προς τους χρήστες του να λειτουργεί σαν ένα ενιαίο και συµπαγές σύστηµα. Ο ορισµός αυτός συµπληρώνεται από το γεγονός ότι το κατανεµηµένο σύστηµα είναι και το λογισµικό το οποίο καταφέρνει να πραγµατοποιήσει αυτή την αφαίρεση και να παρουσιάσει τους ανεξάρτητους υπολογιστές σαν ένα σύστηµα. Το λογισµικό αυτό αναφέρεται πολλές φορές και σαν ενδιάµεσο λογισµικό ή middleware. Ένας άλλος ορισµός είναι ότι ο κατανεµηµένος υπολογισµός είναι ο αποκεντρωµένος και παράλληλος υπολογισµός µε τη χρήση τουλάχιστον δύο υπολογιστών οι οποίοι συνδέονται σε ένα δίκτυο. Τα λειτουργικά συστήµατα, οι γλώσσες προγραµµατισµού καθώς και το υλικό το οποίο χρησιµοποιείται σε ένα κατανεµηµένο σύστηµα µπορεί να διαφέρουν µεταξύ τους κατά πολύ. Ένα κατανεµηµένο σύστηµα είναι παρόµοιο µε µια συστοιχία υπολογιστών µε τη διαφορά ότι οι υπολογιστικοί πόροι είναι γεωγραφικά διάσπαρτοι. 15
Οι παραπάνω ορισµοί µας δίνουν τα βασικά χαρακτηριστικά ενός κατανεµηµένου συστήµατος: είναι µια συλλογή από γεωγραφικά διάσπαρτους, πιθανώς ετερογενείς πόρους οι οποίοι συνεργάζονται για να επιτύχουν ένα κοινό αποτέλεσµα. Η συνεργασία αυτή γίνεται εφικτή από ένα δίκτυο επικοινωνίας και από ένα ενδιάµεσο λογισµικό το οποίο µοιράζονται οι πόροι αυτοί. Το σύστηµα αυτό φαίνεται σαν ένα αυτόνοµο σύστηµα στον τελικό χρήστη. Υπάρχουν φυσικά πολλά είδη κατανεµηµένων συστηµάτων τα οποία κυρίως κατηγοριοποιούνται µε βάση τον τρόπο που συνεργάζονται οι πόροι για να πετύχουν το τελικό αποτέλεσµα, την ιεραρχία που υπάρχει στους πόρους καθώς και από το ενδιάµεσο λογισµικό που χρησιµοποιούν. Το βασικό χαρακτηριστικό αυτού του ενδιάµεσου λογισµικού είναι ότι καταφέρνει να παρέχει τις υπηρεσίες του κατανεµηµένου συστήµατος στον τελικό χρήστη µε έναν διάφανο τρόπο. 2.3 Περιγραφή του Συστήµατος Η παρούσα εργασία ασχολείται µε την µοντελοποίηση, προσοµοίωση και µελέτη της χρονοδροµολόγησης παράλληλων εργασιών σε ένα κατανεµηµένο σύστηµα 32 εξυπηρετών µε εκθετικές αφίξεις και εξυπηρετήσεις, όπου ο κάθε εξυπηρέτης έχει τη δικιά του ουρά αναµονής. Στο σύστηµα εφαρµόζονται διαφορετικοί αλγόριθµοι επιλογής και πειθαρχίας ουράς. Στόχος είναι η µέτρηση της απόδοσης του συστήµατος ανάλογα µε τον αλγόριθµο που χρησιµοποιείται κάθε φορά και η επιλογή του καταλληλότερου αλγορίθµου για κάθε περίπτωση. Η χρονοδροµολόγηση εργασιών σε κατανεµηµένο σύστηµα είναι µια ευρεία επιστηµονική περιοχή, που έχει αποτελέσει το αντικείµενο µελέτης πολλών ερευνητικών εργασιών ( [4-16] ). 16
2.4 Χαρακτηριστικά / Παραδοχές του συστήµατος Παρακάτω αναφέρονται τα κύρια χαρακτηριστικά του συστήµατος προς µελέτη. Το σύστηµα έχει 32 εξυπηρέτες Κάθε εξυπηρέτης έχει τη δική του ουρά αναµονής. Οι διεργασίες έρχονται στο σύστηµα µε ρυθµό άφιξης λ. Οι αφίξεις των jobs είναι εκθετικά κατανεµηµένες. Κάθε διεργασία (job) έχει έναν αριθµό από υποδιεργασίες, tasks. Ο αριθµός αυτός είναι δύναµη του 2, δηλαδή µπορεί να είναι: 1, 2, 4, 8, 16 ή 32. Μια διεργασία θεωρείται ότι έχει ολοκληρωθεί και µπορεί να εγκαταλείψει το σύστηµα εάν όλες οι υποδιεργασίες (tasks) της έχουν ολοκληρώσει την επεξεργασία τους. Το κάθε task έχει το δικό του χρόνο εξυπηρέτησης και οι χρόνοι αυτοί ακολουθούν την εκθετική κατανοµή. Το κάθε task είναι ανεξάρτητο από τα άλλα. Η επιλογή του επεξεργαστή που θα εξυπηρετήσει την κάθε διεργασία µπορεί να γίνει µε δύο τρόπους: 1. Επιλογή του Server µε τη µικρότερη ουρά. 2. Τυχαία επιλογή ουράς (όλες οι ουρές έχουν ίση πιθανότητα επιλογής). Να σηµειώσουµε ότι στην πρώτη περίπτωση αν δύο εξυπηρέτες έχουν το ίδιο µήκος ουράς το πρόγραµµα θα επιλέξει εκείνον που είναι idle. Οι αλγόριθµοι επιλογής των tasks προς επεξεργασία είναι δύο: 1) FCFS (First Come First Served) 2) STF (Shortest Task First) Στο σύστηµα όλα τα jobs έχουν την ίδια προτεραιότητα και δεν υπάρχουν κρίσιµες διεργασίες. Ως συνθήκη τέλους ορίζεται η χρονική στιγµή που το Ν οστό job ολοκληρώνει την επεξεργασία του. Το µέγεθος του N καθορίζεται από τον χρήστη του προγράµµατος. 17
Κατά την έναρξη του προγράµµατος όλοι οι επεξεργαστές και οι ουρές τους είναι κενοί. Η πρώτη διεργασία φτάνει τη χρονική στιγµή µηδέν (χρόνος προσοµοίωσης). Σχήµα 2.1 Γραφική αναπαράσταση του συστήµατος 18
2.5 Η διαδικασία των αφίξεων Όπως αναφέραµε παραπάνω οι µεταξύ των αφίξεων χρόνοι είναι εκθετικά κατανεµηµένοι. Κατά την άφιξη µιας διεργασίας προγραµµατίζεται η άφιξη της επόµενης διεργασίας βάσει της εκθετικής κατανοµής. Κάθε διεργασία που φτάνει στο σύστηµα αποτελείται από έναν αριθµό tasks (υποδιεργασίες). Ο αριθµός αυτός µπορεί να είναι 1, 2, 4, 8, 16 ή 32. Στο πρόγραµµα εξετάζονται τρεις περιπτώσεις: 1. Τα jobs να έχουν 1, 2, 4, 8, 16 ή 32 tasks µε ίση πιθανότητα εµφάνισης (Equal Probabilities). Στην περίπτωση αυτή που απεικονίζεται γραφικά στο παρακάτω σχήµα το κάθε job έχει κατά µέσο όρο (1+2+4+8+16+32)/6 = 10,5 tasks. Σχήµα 2.2 Equal Probabilities 19
2. Τα jobs να έχουν 1, 2, 4 και 8 tasks µε 80% πιθανότητα εµφάνισης και 16 ή 32 tasks µε 20% πιθανότητα. Σε αυτή την περίπτωση (σχήµα 2.3) το κάθε job έχει κατά µέσο όρο (1+2+3+4)*0.80 + (16+32)*0.20 = 7.8 tasks. Σχήµα 2.3 Non Equal Probabilities (80-20) 3. Τα jobs να έχουν 1, 2, 4 και 8 tasks µε 90% πιθανότητα εµφάνισης και 16 ή 32 tasks µε 10% πιθανότητα. Εδώ (σχήµα 2.4) το κάθε Job έχει κατά µέσο όρο (1+2+3+4)*0.90 + (16+32)*0.10 = 5.775 tasks (σχεδόν τα µισά tasks σε σχέση µε την περίπτωση νούµερο ένα ). Σχήµα 2.3 Non Equal Probabilities (90-10) 20
2.6 Η επιλογή της ουράς Όταν ένα job εισέλθει στο σύστηµα τα task του κατανέµονται στις ουρές των εξυπηρετών. Οι αλγόριθµοι επιλογής ουράς είναι δύο. Ο χρήστης του συστήµατος έχει τη δυνατότητα να επιλέξει τον αλγόριθµο που επιθυµεί για κάθε run της προσοµοίωσης. Τυχαία επιλογή της ουράς (Random Queue) Επιλογή της ουράς µε το µικρότερο µήκος, δηλαδή, της ουράς µε τις λιγότερες υποδιεργασίες σε αναµονή (Shortest Queue) 1. Τυχαία επιλογή της ουράς (Random Queue) Για κάθε task επιλέγεται ένας τυχαίος εξυπηρέτης. Όλοι οι εξυπηρέτες έχουν την ίδια πιθανότητα να επιλεγούν ( πιθανότητα = 1/32 = 3.1%). Το task εισάγεται στην ουρά του εξυπηρέτη και εάν εκείνος είναι ελεύθερος (idle) και δεν υπάρχει άλλη διεργασία σε αναµονή, ξεκινάει αµέσως εξυπηρέτηση. Σε αντίθετη περίπτωση παραµένει στην ουρά µέχρι να επιλεγεί από τον εξυπηρέτη για επεξεργασία. 2. Επιλογή της µικρότερης ουράς (Shortest Queue) Ο αλγόριθµος Shortest Queue λειτουργεί ως εξής: ιατρέχει όλες τις ουρές και ελέγχει το µήκος τους: Εάν υπάρχει µόνο µία ουρά µε το µικρότερο µήκος εισάγει το task στην ουρά αυτή. Εάν υπάρχουν περισσότερες από µία ουρές µε το ίδιο µήκος και το µήκος τους είναι διάφορο το µηδενός, δηλαδή οι ουρές δεν είναι κενές τότε επιλέγεται τυχαία µία από αυτές. Αν οι ουρές µε το µικρότερο µήκος είναι κενές ( queue_size = 0 ) τότε γίνεται έλεγχος των εξυπηρετών των ουρών αυτών: Αν υπάρχει µόνο ένας ελεύθερος (idle) εξυπηρέτης και όλοι οι άλλοι είναι busy, τότε επιλέγεται ο εξυπηρέτης αυτός και το task ξεκινά αµέσως επεξεργασία. Αν υπάρχουν περισσότεροι από έναν idle επεξεργαστές τότε επιλέγεται ένας τυχαία και το task ξεκινά αµέσως επεξεργασία. Αν όλοι οι εξυπηρέτες είναι busy, τότε επιλέγεται ένας τυχαία, το task εισάγεται στην ουρά του και αναµένει τη σειρά του για επεξεργασία. 21
Παρακάτω απεικονίζεται η λειτουργία του Shortest Queue Algorithm. Σχήµα 2.4 Ο αλγόριθµος Shortest Queue 22
2.7 Χρονοδροµολόγηση των διεργασιών Όταν ένα Job εισέρχεται στο σύστηµα, τα tasks που τον αποτελούν κατανέµονται στις ουρές βάσει ενός εκ των αλγορίθµων που αναφέρθηκαν παραπάνω. Οι αλγόριθµοι δροµολόγησης των tasks, που υποστηρίζει το σύστηµα είναι δύο: 1. Εξυπηρέτηση µε βάση τη σειρά άφιξης (First Come First Served FCFS) 2. Εξυπηρέτηση µε βάση τη µικρότερη διάρκεια (Shortest Task First STF) Ο χειριστής του προγράµµατος επιλέγει τον αλγόριθµο που θα χρησιµοποιηθεί σε κάθε εκτέλεση (run). 2.7.1 First Come First Served (FCFS) Πρόκειται για τον απλούστερο αλγόριθµο χρονοδροµολόγησης. Με αυτόν, οι διεργασίες εξυπηρετούνται µέχρι την ολοκλήρωση τους µε τη σειρά που εισήλθαν στη λίστα έτοιµων διεργασιών. Όπως φαίνεται και από το όνοµα του αλγορίθµου, η διεργασία που εισέρχεται πρώτη στην ουρά θα εξυπηρετηθεί και πρώτη. Κάθε φορά που µια διεργασία εισέρχεται στην ουρά ενός εξυπηρέτη, τοποθετείται στο τέλος της ουράς αυτής. Κάθε φορά που τελειώνει η εξυπηρέτηση µιας διεργασίας ο εξυπηρέτης επιλέγει για επεξεργασία την πρώτη διεργασία στην ουρά. 23
2.7.2 Shortest Task First (STF) Ο αλγόριθµος εξυπηρέτησης µε βάση τη µικρότερη διάρκεια κατατάσσει τις διεργασίες µε βάση τη διάρκεια εκτέλεσης τους. Η πιο σύντοµη διεργασία (µικρός χρόνος εξυπηρέτησης) τοποθετείται στην αρχή της ουράς και η πιο µεγάλη (χρονικά) στο τέλος της ουράς. Όταν µια διεργασία εισέρχεται στην ουρά ο χρονοδροµολογητής την τοποθετεί ανάµεσα στην αµέσως πιο σύντοµη και την αµέσως µεγαλύτερη. Κάθε φορά που ολοκληρώνεται η επεξεργασία µιας διεργασίας το σύστηµα επιλέγει να εξυπηρετήσει εκείνη που βρίσκεται στην αρχή της ουράς. Τα µειονεκτήµατα του αλγόριθµου είναι ότι σε ένα σύστηµα είναι πάρα πολύ δύσκολο έως αδύνατο να εκτιµηθεί µε ακρίβεια ο χρόνος που απαιτείται για την εκτέλεση µιας διεργασίας. Για το λόγο αυτό, ο αλγόριθµος εφαρµόζεται µόνο σε ειδικά συστήµατα και στο επίπεδο της µακροχρόνιας δροµολόγησης. Στα συστήµατα αυτά, οι χρήστες, όταν υποβάλουν µια διεργασία στο σύστηµα, δηλώνουν τη µέγιστη διάρκεια εκτέλεσης της. Αν η διεργασία δεν έχει ολοκληρωθεί στο δηλωµένο χρόνο, συνήθως διακόπτεται. Εµείς στο σύστηµα µας θεωρούµε ότι γνωρίζουµε το χρόνο εκτέλεσης κάθε διεργασίας κατά την άφιξη της. Ένα άλλο µειονέκτηµα του αλγορίθµου αυτού είναι ότι καθώς επιλέγεται πάντα η διεργασία µε το µικρότερο χρόνο εξυπηρέτησης, υπάρχει η πιθανότητα µια διεργασία µε πολύ µεγάλο χρόνο εξυπηρέτησης να µην εκτελεστεί ποτέ εάν στο σύστηµα καταφτάνουν συνέχεια διεργασίες µε µικρότερο χρόνο εξυπηρέτησης από αυτή. Το φαινόµενο αυτό ονοµάζεται παρατεταµένη στέρηση (starvation) και αντιµετωπίζεται µε µεθόδους ωρίµανσης (aging). 24
2.7.3 Παράδειγµα χρονοδροµολόγησης Για την καλύτερη κατανόηση των αλγορίθµων χρονοδροµολόγησης θα χρησιµοποιήσουµε ένα απλό παράδειγµα: Έστω ότι εισέρχονται στην ουρά ενός εξυπηρέτη οι παρακάτω διεργασίες : Στα παρακάτω διαγράµµατα µε κίτρινο συµβολίζεται ο χρόνος αναµονής στην ουρά και µε πράσινο ο χρόνος επεξεργασίας στον εξυπηρέτη. Mε τον FCFS έχουµε: Μέσος χρόνος αναµονής = ( 0 + 6 + 28 + 26 ) / 4 = 15 χρονικές µονάδες. Μέσος χρόνος απόκρισης = [ (0+11) + (6+25) + (28+2) + (26+10) ] / 4 = 27 χρονικές µονάδες. Γενικά η απόδοση του αλγορίθµου είναι πολύ χαµηλή σε σχέση µε όλους τους υπόλοιπους ποσοτικούς δείκτες εκτίµησης απόδοσης αλγορίθµων χρονοδροµολόγησης. Παρατηρούµε ότι η διεργασία Γ µε διάρκεια µόλις 2 χρονικές µονάδες αναγκάστηκε να περιµένει 28 χρονικές µονάδες. 25
Με τον STF έχουµε: Μέσος χρόνος αναµονής = ( 0 + 18 + 3 + 1 ) / 4 = 5,5 χρονικές µονάδες. Μέσος χρόνος απόκρισης = [ (0+11) + (18+25) + (3+2) + (1+10) ] / 4= 17,5 χρονικές µονάδες. Παρατηρούµε ότι οι χρόνοι αναµονής και απόκρισης είναι πολύ µικρότεροι σε σχέση µε εκείνους που έδωσε ο FCFS. Μάλιστα αποδεικνύεται ότι ο αλγόριθµος αυτός δίνει το βέλτιστο µέσο χρόνο αναµονής. 26
2.8 Μετρικές απόδοσης του συστήµατος Στο σύστηµα υπολογίζονται οι παρακάτω µετρικές απόδοσης. Βάσει αυτών µπορούµε να βγάλουµε συµπεράσµατα για το ποιος αλγόριθµος είναι ο πιο αποδοτικός σε κάθε περίπτωση. Μέσος Χρόνος Απόκρισης (Mean Response Time) Ο χρόνος απόκρισης είναι ο χρόνος που κάνει το job από την είσοδο του στο σύστηµα µέχρι την έξοδο του από αυτό. Περιλαµβάνει τον χρόνο αναµονής στην ουρά και τον χρόνο εξυπηρέτησης στον server. Καθώς στο σύστηµα µας το κάθε job έχει πολλά tasks, ο χρόνος απόκρισης αρχίζει να µετράει από τη στιγµή που το job εισέρχεται στο σύστηµα µέχρι τη στιγµή που ολοκληρώνεται η εξυπηρέτηση και του τελευταίου task. Μέγιστος Χρόνος Απόκρισης (Max Response Time) Η µέση τιµή δεν είναι πάντα αρκετή για να µας δώσει µια ακριβή εικόνα του συστήµατος. Έτσι εκτός από το µέσο χρόνο απόκρισης το σύστηµα υπολογίζει και το µέγιστο χρόνο απόκρισης, δηλαδή το µεγαλύτερο χρόνο που ένα job καθυστέρησε στο σύστηµα. Μέσος χρόνος αναμονής (Mean Waiting Time) Για κάθε ουρά υπολογίζεται ο µέσος χρόνος αναµονής σε αυτήν. Χρόνος αναµονής είναι ο χρόνος από τη στιγµή που ένα task εισέρχεται στην ουρά µέχρι τη στιγµή που επιλέγεται για επεξεργασία. Μέσο μήκος ουράς (Mean Queue Length) Το σύστηµα µας έχει 32 ουρές. Υπολογίζεται λοιπόν το µέσο µήκος κάθε µία από αυτές και στη συνέχεια υπολογίζεται το µέσο µήκος όλων των ουρών. Είναι εµφανές ότι µεγαλύτερο µέσο µήκος ουράς του συστήµατος σηµαίνει µεγάλο αριθµό διεργασιών που περιµένουν στις ουρές πράγµα που συνεπάγεται µεγαλύτερο µέσο χρόνο αναµονής και κατ επέκταση µεγαλύτερο µέσο χρόνο απόκρισης. Μέγιστο μήκος ουράς (Max Queue Length) Πρόκειται για το µέγιστο µήκος ουράς που παρατηρήθηκε κατά τη διάρκεια της προσοµοίωσης. 27
Συνολικός χρόνος προσομοίωσης (Total Simulation Time) Πρόκειται για το χρόνο από την είσοδο του πρώτου job στο σύστηµα µέχρι να ικανοποιηθεί η συνθήκη τέλους. Μέση χρησιμοποίηση του συστήματος (Mean System Utilization) Η µέση χρησιµοποίηση του συστήµατος αφορά το πόσο απασχοληµένοι ήταν οι εξυπηρέτες του συστήµατος. Αρχικά υπολογίζεται η µέση χρησιµοποίηση για κάθε εξυπηρέτη χωριστά και έπειτα η µέση εξυπηρέτηση όλου του συστήµατος. 28
Κεφάλαιο 3 ο Σχεδίαση του Συστήματος 3.1 Περιπτώσεις Χρήσης Αρχικά, σχεδιάζουµε τις περιπτώσεις χρήσης του συστήµατος. Από την ανάλυση και την περιγραφή του συµπεραίνουµε ότι οι κύριες περιπτώσεις χρήσης θα είναι: Άφιξη του job στο σύστηµα Είσοδος στην ουρά κάποιου εξυπηρέτη Ολοκλήρωση της επεξεργασίας (Αναχώρηση) Έξοδος από το σύστηµα Παρακάτω απεικονίζεται το διάγραµµα περιπτώσεων χρήσης του συστήµατος: Σχήµα 3.1 Το διάγραµµα περιπτώσεων χρήσης 29
3.1.1 Άφιξη νέου job στο σύστηµα Στη παράγραφο αυτή εξετάζεται η περίπτωση χρήσης «άφιξη ενός job στο σύστηµα». Παρακάτω παρουσιάζεται το διάγραµµα δραστηριοτήτων για την περίπτωση αυτή. Σχήµα 3.2 Το διάγραµµα δραστηριοτήτων για την άφιξη νέου job στο σύστηµα 30
3.1.2 Εισαγωγή του job στην ουρά αναµονής Παρακάτω απεικονίζεται το διάγραµµα δραστηριοτήτων για την περίπτωση χρήσης: Εισαγωγή του job στην ουρά αναµονής. Ο αλγόριθµος Shortest Queue αναφέρεται συνοπτικά καθώς έχει περιγραφεί αναλυτικά στην παράγραφο 2.6. Σχήµα 3.3 Το διάγραµµα δραστηριοτήτων για την εισαγωγή ενός job στην ουρά αναµονής 31
3.1.3 Ολοκλήρωση της εξυπηρέτησης (Αναχώρηση) Στην παράγραφο αυτή απεικονίζεται το διάγραµµα δραστηριοτήτων για την περίπτωση χρήσης: Αναχώρηση διεργασίας από τον server. Σχήµα 3.4 Το διάγραµµα δραστηριοτήτων για την περίπτωση αναχώρησης διεργασίας από τον server 32
3.2 ιαχείριση των γεγονότων Στο σύστηµα παρατηρούνται δύο τύποι γεγονότων: Άφιξη νέου job στο σύστηµα Αναχώρηση διεργασίας από το σύστηµα Η πρώτη άφιξη γίνεται τη χρονική στιγµή 0 (χρόνος προσοµοίωσης). Σε κάθε νέα άφιξη διεργασίας προγραµµατίζεται η επόµενη άφιξη και εισάγεται στη λίστα γεγονότων. Η επόµενη άφιξη υπολογίζεται µε βάση την εκθετική κατανοµή. Έτσι, µε κάθε νέα άφιξη γίνονται οι παρακάτω ενέργειες: 1. Προγραµµατισµός επόµενης άφιξης µε βάση την εκθετική κατανοµή 2. Υπολογισµός του αριθµού των tasks 3. Καθορισµός του χρόνου εξυπηρέτησης για κάθε task µε βάση την εκθετική κατανοµή Παρατηρούµε λοιπόν, ότι το κάθε task έχει δύο χρόνους που µας ενδιαφέρουν. Τον χρόνο άφιξης Τον χρόνο εξυπηρέτησης Όταν ένα task επιλέγεται από κάποιον εξυπηρέτη για επεξεργασία το σύστηµα δηµιουργεί ένα γεγονός αναχώρησης, το οποίο προστίθεται στη λίστα γεγονότων και εξαρτάται από το χρόνο εξυπηρέτησης του task που είχε ήδη υπολογιστεί κατά την άφιξη του. Για παράδειγµα αν τη χρονική στιγµή 10 επιλέγεται για επεξεργασία ένα task µε χρόνο εξυπηρέτησης 3, αυτόµατα δηµιουργείται ένα γεγονός αναχώρησης µε χρόνο 10 + 3 = 13 χρονικές µονάδες το οποίο προστίθεται στη λίστα γεγονότων. Κάθε γεγονός πρέπει να έχει τα εξής χαρακτηριστικά: 1. να προσδιορίζει το χρόνο που πρέπει να συµβεί, 2. να προσδιορίζει εάν είναι event άφιξης ή αναχώρησης, 3. αν πρόκειται για αναχώρηση θα πρέπει να καθορίζει σε ποια ουρά αναφέρεται η αναχώρηση. Στη λίστα των γεγονότων, τα events τοποθετούνται µε βάσει τη χρονική στιγµή που πρέπει να συµβεί το καθένα. Έτσι το event που θα συµβεί συντοµότερα θα είναι πρώτο στη λίστα, ενώ το πιο αποµακρυσµένο χρονικά event θα βρίσκεται τελευταίο. 33
Παράδειγμα Έστω ότι τη χρονική στιγµή 0 φτάνει στο σύστηµα ένα job µε 4 tasks. Για το κάθε task υπολογίζεται ο χρόνος εξυπηρέτησης του και γίνεται η κατανοµή των tasks στις ουρές. Έστω ότι η επιλογή της ουράς γίνεται µε shortest queue οπότε, καθώς όλες οι ουρές είναι άδειες το κάθε task θα τοποθετηθεί σε διαφορετική ουρά και θα ξεκινήσει αµέσως επεξεργασία. Επίσης προγραµµατίζεται η επόµενη άφιξη job τη χρονική στιγµή 1.5. Η λίστα των γεγονότων θα είναι η εξής: 34
3.3 Ο µηχανισµός εξέλιξης του χρόνου Η διαχείριση του χρόνου γίνεται µε τη βοήθεια µιας πραγµατικής µεταβλητής που ονοµάζεται time και προσοµοιώνει το ρολόι του συστήµατος. Η τιµή του ρολογιού δεν µεταβάλλεται κατά τακτά χρονικά διαστήµατα αλλά σύµφωνα µε τον χρόνο του επόµενου γεγονότος. ηλαδή, στο παράδειγµα της προηγούµενης παραγράφου το ρολόι θα πάρει τις τιµές: 1, 1.5, 2, 3, 5. Ολόκληρη η προσοµοίωση είναι ουσιαστικά µια δοµή επανάληψης που περιγράφεται από το παρακάτω διάγραµµα: Σχήµα 3.5 Η βασική δοµή επανάληψης της προσοµοίωσης 35
Είναι, δηλαδή ένα loop το οποίο ελέγχει εάν έχει συµβεί ο απαιτούµενος αριθµός αναχωρήσεων για τον τερµατισµό της προσοµοίωσης και αν όχι καλεί τη ρουτίνα χρόνου. Η λειτουργία της ρουτίνας αυτής απεικονίζεται στο παρακάτω διάγραµµα: Σχήµα 3.6 Η ρουτίνα χρόνου 36
3.4 ηµιουργία Τυχαίων Παρατηρήσεων Οι χρόνοι των αφίξεων και των εξυπηρετήσεων είναι εκθετικά κατανεµηµένοι. Θα πρέπει λοιπόν το πρόγραµµα να δηµιουργεί τυχαίες παρατηρήσεις µε βάση την εκθετική κατανοµή. Αυτό επιτυγχάνεται µε την τεχνική του αντίστροφου µετασχηµατισµού. Η συνάρτηση της εκθετικής κατανοµής δίνεται από τον τύπο: F(x) = Για τον υπολογισµό της αντίστροφης συνάρτησης της F(x) λύνουµε ως προς x και έχουµε: F -1 (u) = (1/λ) ln(1-u) Όπου λ είναι ο ρυθµός άφιξης των εργασιών και u ένας τυχαίος αριθµός µεταξύ του 0 και του 1. Συνεπώς, για τη δηµιουργία εκθετικών παρατηρήσεων απλά δηµιουργούµε έναν τυχαίο αριθµό U ~ U(0,1) και θέτουµε: Χ = (1/λ) ln U 37
Κεφάλαιο 4 ο Υλοποίηση του Συστήματος 4.1 Καθορισµός των κλάσεων Σύµφωνα µε όσα ειπώθηκαν παραπάνω καταλήγουµε ότι το πρόγραµµα θα αποτελείται από οχτώ κλάσεις που είναι οι εξής: 1. Class Job Η κλάση αυτή θα αναπαριστά τη διεργασία (job) που φτάνει και εξυπηρετείται στο σύστηµα. Κύρια attributes της κλάσης αυτής θα είναι το arrival time καθώς και ο αριθµός των tasks που περιέχει. 2. Class Task Πρόκειται για την κλάση που αναπαριστά την υποδιεργασία (task) που ανήκει σε κάποιο συγκεκριµένο job και ζητά επεξεργασία από το σύστηµα. Κύρια attributes της κλάσης αυτής θα είναι το arrival και το service time. 3. Class Queue Η κλάση αυτή προσοµοιώνει τον επεξεργαστή µε την ουρά του. Στην περίπτωση του FCFS η κλάση αυτή είναι µια απλή συνδεδεµένη λίστα ενώ στην περίπτωση του STF είναι διπλή συνδεδεµένη λίστα. 4. Class Event Εκφράζει τα γεγονότα που δηµιουργούνται κατά την άφιξη µιας διεργασίας στο σύστηµα (arrival event) και κατά την είσοδο της διεργασίας στον επεξεργαστή (departure event). 5. Class EventList Πρόκειται για µια διπλή συνδεδεµένη λίστα στην οποία αποθηκεύονται τα events. 6. Class Simulation Πρόκειται για την κλάση που προσοµοιώνει το σύστηµα και διαχειρίζεται τις αφίξεις, τις εξυπηρετήσεις, τη δηµιουργία γεγονότων κ.λ.π. 38
7. Class Generator Η κλάση αυτή δηµιουργεί εκθετικά κατανεµηµένους χρόνους για τις αφίξεις και της εξυπηρετήσεις καθώς και τυχαίους αριθµούς. 8. Class Statistics Η κλάση αυτή υπολογίζει τα στατιστικά στοιχεία του συστήµατος. Κάποιες από τις κλάσεις αυτές διαφοροποιούνται ανάλογα µε το εάν έχουµε First Come First Served ή Shortest Task First. Στην περίπτωση του FCFS οι ουρές θα µπορούσαν να αναπαρασταθούν µε µία απλή συνδεδεµένη λίστα ενώ στην περίπτωση του STF θα ήταν πιο εύχρηστη µία διπλή συνδεδεµένη λίστα. Έτσι, θα κατασκευάσουµε δύο διαφορετικά προγράµµατα. Το ένα θα δροµολογεί τις διεργασίες βάσει του αλγορίθµου FCFS ενώ το άλλο θα δίνει προτεραιότητα στα µικρότερα tasks (STF). 39
4.2 Το διάγραµµα κλάσεων Παρακάτω απεικονίζεται το διάγραµµα κλάσεων του συστήµατος. 40
4.3 Τεκµηρίωση του πηγαίου κώδικα Η παράγραφος αυτή περιλαµβάνει έναν αναλυτικό σχολιασµό του κώδικα ανά κλάση του προγράµµατος. 4.3.1 class Job Η κλάση Job προσοµοιώνει τις διεργασίες που καταφτάνουν στο σύστηµα σε τακτά χρονικά διαστήµατα και ζητούν επεξεργασία. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: int numoftasks Ο αριθµός των tasks του job double arrival_time Ο χρόνος άφιξης του job int numoftasksexecuted Ο αριθµός των tasks που έχουν ολοκληρώσει επεξεργασία Μέθοδοι Job(int numtasks, double AT) Πρόκειται για τον constructor της κλάσης, ο οποίος την αρχικοποιεί ορίζοντας το χρόνο άφιξης και τον αριθµό των tasks που περιέχει το Job. double getat() Επιστρέφει το χρόνο άφιξης (arrival_time). int executedtask() Η µέθοδος αυτή καλείται κάθε φορά που ολοκληρώνει την εξυπηρέτηση του κάποιο από τα tasks του job. Αυξάνει το µετρητή numoftasksexecuted κατά ένα και εάν έχουν εξυπηρετηθεί όλα τα tasks του Job επιστρέφει 1. Σε διαφορετική περίπτωση επιστρέφει 0. 41
4.3.2 class Task Η κλάση αυτή προσοµοιώνει τις υποδιεργασίες (tasks). Χαρακτηριστικά Σε περίπτωση που έχουµε FCFS, τα χαρακτηριστικά της κλάσης είναι τα εξής: double service_time Ο χρόνος εκτέλεσης του task. double arrival_time Ο χρόνος άφιξης του task. double time_task_enters_queue Η χρονική στιγµή που το task εισέρχεται στην ουρά. double time_task_leaves_queue Η χρονική στιγµή που το task εξέρχεται από την ουρά. Job* job είκτης στο job, στο οποίο ανήκει το task. Task *next είκτης στο επόµενο task στην ουρά. Στην περίπτωση που έχουµε STF προστίθεται ένα ακόµη χαρακτηριστικό : Task *prev. Όπως ειπώθηκε παραπάνω για να υλοποιηθεί ο STF χρησιµοποιούµε διπλή συνδεδεµένη λίστα, οπότε πρέπει να ορίσουµε και έναν ακόµα δείκτη που να δείχνει στο προηγούµενο task της ουράς (Task*prev). Επίσης, στην περίπτωση του STF έχουµε ακόµα δύο µεθόδους (Task*getprev() και void setprev(task*t)). Η κλάση Task µε FCFS Η κλάση Task µε STF 42
Μέθοδοι Task(double ST,double AT, Job* j) Πρόκειται για τον constructor της κλάσης, οποίος θέτει τιµές στο χρόνο εξυπηρέτησης (service_time) και στο χρόνο άφιξης (arrival_time) και υποδεικνύει το job στο οποίο ανήκει το συγκεκριµένο task (Job *j). Task* getprev(){return prev;} Επιστρέφει την τιµή του δείκτη prev. void setprev(task* t) {prev = t;} Καθορίζει την τιµή του δείκτη prev. Task* getnext(){return next;} Επιστρέφει την τιµή του δείκτη next. void setnext(task* t) {next = t;} Καθορίζει την τιµή του δείκτη next. double getst() {return service_time;} Επιστρέφει το χρόνο εξυπηρέτησης (service time). double getat() {return arrival_time;} Επιστρέφει το χρόνο άφιξης (arrival time). void settteq(double time) Καθορίζει τη χρονική στιγµή που το task εισέρχεται στην ουρά. void setttlq(double time) Καθορίζει τη χρονική στιγµή που το task φεύγει από την ουρά και ξεκινά εξυπηρέτηση. double get_delay_in_queue() Επιστρέφει το χρόνο αναµονής του task στην ουρά. Job* getjob(){return job;} Επιστρέφει το job στο οποίο ανήκει το task. 43
4.3.3 class Queue Η κλάση αυτή προσοµοιώνει τον εξυπηρέτη µε την ουρά του. Στην περίπτωση που έχουµε First Come First Served η κλάση Queue είναι µια απλή συνδεδεµένη λίστα, ενώ στην περίπτωση που έχουµε STF, η κλάση είναι µια διπλή συνδεδεµένη λίστα. Η κύρια διαφορά των δύο είναι στην εισαγωγή ενός task στην ουρά. Στον FCFS το task τοποθετείται στο τέλος της ουράς, ενώ στον STF τα tasks είναι ταξινοµηµένα µε βάση το χρόνο εξυπηρέτησης. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: int busy Παίρνει την τιµή 1 αν ο εξυπηρέτης είναι busy και την τιµή 0 αν είναι idle. Task* processing είκτης στο task που εξυπηρετείται εκείνη τη χρονική στιγµή. Αν δεν εξυπηρετείται κανένα task ο δείκτης έχει την τιµή NULL. Task *head είκτης στην κεφαλή της ουράς Task *tail είκτης στο τελευταίο στοιχείο της ουράς int size Το µέγεθος της ουράς Μέθοδοι Queue() Constructor της κλάσης. Αρχικοποιεί τις µεταβλητές. Task* getprocessing() Επιστρέφει έναν δείκτη στο task που εκτελείται τη δεδοµένη στιγµή. Task* deletehead() ιαγράφει το πρώτο task της ουράς. void setbusy(int b) Θέτει τον εξυπηρέτη ίσο µε busy (απασχοληµένος). 44
int isbusy() Επιστρέφει 1 εάν ο εξυπηρέτης είναι busy και 0 στην αντίθετη περίπτωση. bool isempty() Επιστρέφει True εάν η ουρά είναι άδεια και False σε άλλη περίπτωση. void setprocessing(task *t) Καθορίζει το task που επιδέχεται επεξεργασία εκείνη τη στιγµή. int getsize() Επιστρέφει το µέγεθος της ουράς. void insertlast(task* t) (FCFS) Η µέθοδος αυτή χρησιµοποιείται µόνο όταν έχουµε FCFS και εισάγει ένα task στο τέλος της ουράς. void insert(task* t) (STF) Η µέθοδος αυτή χρησιµοποιείται µόνο όταν έχουµε STF και εισάγει το task στην κατάλληλη θέση ανάλογα µε την τιµή του χρόνου εξυπηρέτησης του. Η κλάση Queue µε FCFS Η κλάση Queue µε STF 45
4.3.4 class Event Η κλάση event προσοµοιώνει τα γεγονότα στο σύστηµα µας. Υπάρχουν δύο κατηγορίες γεγονότων: οι αφίξεις και οι αναχωρήσεις. Και οι δύο τύποι πρέπει υποχρεωτικά να καθορίζουν τη χρονική στιγµή που θα λάβουν χώρα. Επιπρόσθετα, η κάθε αναχώρηση πρέπει να προσδιορίζει και την ουρά στην οποία αναφέρεται. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: double EventTime Ο χρόνος που θα συµβεί το γεγονός int EventType Ο τύπος του Event (arrival ή departure) int Serv_num Ο server στον οποίο αναφέρεται το event αν πρόκειται για departure. Event *next είκτης στο επόµενο event της λίστας Event *prev είκτης στο προηγούµενο event της λίστας Μέθοδοι Event (int, int, double) O constructor της κλάσης. int gettype() Επιστρέφει την τιµή της µεταβλητής EventType int getsn() Επιστρέφει την τιµή της µεταβλητής Serv_num, δηλαδή, τον αριθµό της ουράς στην οποία αναφέρεται η αναχώρηση. void seteventtime(double ET) Θέτει την τιµή του EventType ίση µε ET. double geteventtime() Επιστρέφει την τιµή του EventType. 46
void setnext(event *e) Θέτει το δείκτη next ίσο µε e. Event *getnext(void) Επιστρέφει την τιµή του next. 4.3.5 class EventList Η κλάση EventList αποτελεί ουσιαστικά τη λίστα γεγονότων. Πρόκειται για µία διπλή συνδεδεµένη λίστα (Doubly Linked List) στην οποία τα γεγονότα ταξινοµούνται µε βάση τη χρονική στιγµή που θα συµβούν. Έτσι το event που θα συµβεί συντοµότερα θα είναι πρώτο στη λίστα, ενώ το πιο αποµακρυσµένο χρονικά event θα βρίσκεται τελευταίο. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: int size Το µέγεθος της λίστας Event *first είκτης στο πρώτο στοιχείο της λίστας Event *last Το τελευταίο στοιχείο της λίστας Μέθοδοι EventList() Ο constructor της κλάσης. Αρχικοποιεί τις µεταβλητές της. void insert(event* e) Ρουτίνα που εισάγει ένα νέο event στη λίστα. Η θέση που θα τοποθετηθεί το νέο event εξαρτάται από τη χρονική στιγµή που θα συµβεί αυτό. Event* getfirst() Επιστρέφει το δείκτη first. int getsize() Επιστρέφει το µέγεθος της λίστας. void deletefirst() ιαγράφει το πρώτο στοιχείο της λίστας. 47
4.3.6 class Generator Η κλάση αυτή αποτελεί τη γεννήτρια των τυχαίων και εκθετικών αριθµών, που χρησιµοποιούνται στις κατανοµές. Περιλαµβάνει 6 seeds, ένα για κάθε τυχαίο αριθµό που πρέπει να υπολογίσουµε. Παρακάτω αναγράφονται τα χαρακτηριστικά και οι µέθοδοι της κλάσης. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: double seed1, seed2, seed3, seed4, seed5, seed6 Πρόκειται για τα seeds, απαραίτητα για τη δηµιουργία τυχαίων παρατηρήσεων. double y1, y2, y3, y4, y5, y6 Μεταβλητές απαραίτητες για τη γεννήτρια τυχαίων αριθµών. Είναι έξι γιατί χρειαζόµαστε έξι διαφορετικές ακολουθίες τυχαίων αριθµών στο πρόγραµµα. Μέθοδοι Generator() Ο constructor της κλάσης. Αρχικοποιεί τις µεταβλητές της. double random(double ygen, int type) Η παραπάνω µέθοδος παράγει τυχαίους αριθµούς µεταξύ του 0 και του 1. Χρησιµοποιεί το κατάλληλο seed ανάλογα µε την τιµή της µεταβλητής type. Για παράδειγµα θα χρησιµοποιηθεί διαφορετικό seed αν ο τυχαίος αριθµός που υπολογίζεται αναφέρεται στην επιλογή ουράς και διαφορετικό αν αναφέρεται στις αφίξεις. double expon(double mean, int type) Η µέθοδος αυτή παράγει εκθετικούς αριθµούς χρησιµοποιώντας τη µέθοδο random. Και πάλι παίζει ρόλο η µεταβλητή type καθώς θέλουµε διαφορετική κατανοµή για τις αφίξεις και άλλη για τις εξυπηρετήσεις. 48
4.3.7 class Statistics Η κλάση Statistics περιέχει µεθόδους υπολογισµού των στατιστικών στοιχείων του συστήµατος. Μετά το τέλος της προσοµοίωσης καταγράφει τα αποτελέσµατα σε ένα αρχείο κειµένου. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: double mean_interarrival_time Μεταβλητή για το χρόνο που µεσολαβεί µεταξύ των αφίξεων. double last_arrival_time Ο χρόνος που είχαµε την τελευταία άφιξη. double mean_serv_time Ο µέσος χρόνος εξυπηρέτησης. double Serv_Utilisation[32] Η χρησιµοποίηση του server (για κάθε server ξεχωριστά). double time_last_delay[32] Η χρονική στιγµή που έγινε η τελευταία καθυστέρηση. double Avg_delay_in_queue[32] Μέση καθυστέρηση στην ουρά. int total_jobs_in_queue[32] Ο αριθµός των Jobs στην ουρά. int total_delays[32] Ο αριθµός των καθυστερήσεων. double Avg_queue_length[32] Το µέσο µήκος της ουράς. int last_queue_size[32] Το τελευταίο µήκος της ουράς. double time_last_queue_size[32] Η χρονική στιγµή που είχαµε το τελευταίο µήκος της ουράς. double mean_response_time Μέσος χρόνος απόκρισης για τα tasks. 49
double mean_response_time_jobs Μέσος χρόνος απόκρισης για τα jobs. double max_response_time Μέγιστος χρόνος απόκρισης για τα jobs. double last_system_change Η χρονική στιγµή που είχαµε την τελευταία αλλαγή στην κατάσταση του συστήµατος (αφιξη/αναχώρηση). double Avg_jobs_in_system Μέσος αριθµός των jobs στο σύστηµα. int jobs_in_system Ο αριθµός των jobs στο σύστηµα. int max_jobs_in_system Ο µέγιστος αριθµός των jobs στο σύστηµα. int total_tasks O συνολικός αριθµός των tasks που πέρασαν από το σύστηµα. int total_jobs O συνολικός αριθµός των jobs που πέρασαν από το σύστηµα. ofstream file Το αρχείο στο οποίο καταγράφονται τα στατιστικά στοιχεία του συστήµατος. 50
Μέθοδοι Παρακάτω καταγράφονται οι βασικότεροι µέθοδοι της κλάσης Statistics. Statistics() Ο constructor της κλάσης. Αρχικοποιεί τις µεταβλητές της. void calc_mean_interarrival_time(double time) H µέθοδος αυτή υπολογίζει το χρόνο µεταξύ των αφίξεων (mean interarrival time). void calc_mean_serv_time(double time) Η παραπάνω µέθοδος υπολογίζει το µέσο χρόνο εξυπηρέτησης (mean service time). void printstats(double time, int QD, int, int, int, char, char) Καταγράφει τα στατιστικά στοιχεία στο αρχείο file. void increase_serv_utilisation(int qnum, double time) Καλείται κάθε φορά που έχουµε αναχώρηση και ενηµερώνει τη µεταβλητή που κρατά τη χρησιµοποίηση των εξυπηρετών. Έτσι υπολογίζεται η µέση χρησιµοποίηση για κάθε server και κατ επέκταση και όλου του συστήµατος. void calc_avg_delay_in_queue(int qnum, double delay) Υπολογίζει το µέσο χρόνο αναµονής στην ουρά. void queue_size_change(int qnum, int qsize, double time) Καλείται όποτε αλλάζει το µήκος της ουράς, δηλαδή, όποτε έχουµε άφιξη η αναχώρηση και υπολογίζει το µέσο µήκος ουράς. void increase_response_time(double time, double AT) Υπολογίζει το µέσο χρόνο απόκρισης για τα tasks του συστήµατος. void increase_response_time_jobs(double time, double AT) Υπολογίζει το µέσο χρόνο απόκρισης για τα Jobs του συστήµατος. void calc_mean_jobs_in_system(double time, int ) Υπολογίζει το µέσο αριθµό των Jobs στο σύστηµα. 51
4.3.7 class Simulation Η κλάση Simulation αποτελεί την κύρια κλάση προσοµοίωσης του συστήµατος και περιέχει τη διαχείριση των αφίξεων, των αναχωρήσεων, του χρόνου, της λίστας των γεγονότων κ.λ.π. Χαρακτηριστικά Τα χαρακτηριστικά της κλάσης είναι τα εξής: Statistics s Αντικείµενο της κλάσης Statistics. Generator gen Αντικείµενο της κλάσης Generator. Queue queues[32] Οι 32 ουρές / εξυπηρέτες του συστήµατος. double time Το ρολόι του συστήµατος. EventList events Αντικείµενο της κλάσης EventList. int system_arrivals Ο αριθµός των αφίξεων στο σύστηµα. int system_departs Ο αριθµός των αναχωρήσεων από το σύστηµα. int tasks_in_system Ο αριθµός των tasks στο σύστηµα. int queue_departs Ο αριθµός των αναχωρήσεων από τις ουρές. int system_delays; Ο αριθµός των καθυστερήσεων στο σύστηµα. double l Ο ρυθµός άφιξης των jobs (λ). double m Ο ρυθµός εξυπηρέτησης (µ). 52
char type Μεταβλητή που κρατά την επιλογή του χρήστη για τον τρόπο επιλογής της ουράς. char type2 Μεταβλητή που κρατά την επιλογή του χρήστη για το µέσο αριθµό των tasks ανά job. ofstream file Το log file. Μέθοδοι Παρακάτω καταγράφονται οι βασικότεροι µέθοδοι της κλάσης Simulation. Simulation(double d1, double d2, char c1, char c2) Ο constructor της κλάσης. int getsd() Επιστρέφει την τιµή της µεταβλητής system_delays. void stats() Καλεί την printstats της Statistics. void Arrival() Άφιξη νέου job στο σύστηµα. void Departure(int qnum) Ρουτίνα αναχώρησης job από το σύστηµα. void AdvanceClock() Μετακίνηση του ρολογιού στο χρόνο του επόµενου event. int pickqueue() Επιλέγει τη µικρότερη ουρά. Αν δυο ουρές έχουν ίδιο µήκος επιλέγεται αυτή µε idle επεξεργαστή. int pickqueue2() Τυχαία επιλογή της ουράς. int random_numoftasks() Το κάθε job έχει 1,2,4,8,16 ή 32 tasks µε ίση πιθανότητα εµφάνισης. int numoftasks2(char) Το κάθε job έχει 1,2,4,8,16 ή 32 tasks µε µεγαλύτερη πιθανότητα εµφάνισης των 1,2,3,4 και 8. 53
4.4 Είσοδος / Έξοδος του συστήµατος Το σύστηµα έχει σαν είσοδο ένα αρχείο κειµένου (Input.txt) στο οποίο ο χρήστης καθορίζει το mean interarrival time (µέσος χρόνος µεταξύ τον αφίξεων, λ) και το mean service time (µέσος χρόνος εξυπηρέτησης, 1/µ) των διεργασιών. Επίσης καθορίζει τη συνθήκη τέλους. Κατά την εκτέλεση του προγράµµατος ο χρήστης καλείται να επιλέξει τον αλγόριθµο επιλογής της ουράς καθώς και τον αριθµό των tasks που θα έχει το κάθε job (µε πιθανότητες ή χωρίς). Η έξοδος του συστήµατος είναι δύο αρχεία κειµένου. Statistics.txt περιέχει τις µετρικές απόδοσης που περιγράφηκαν στην ενότητα 2.8. Επίσης, σε αυτό καταγράφονται στατιστικά στοιχεία για όλες τις ουρές του συστήµατος. Log_File.txt περιέχει όλα τα γεγονότα µε τη σειρά που συµβαίνουν στο σύστηµα. Input.txt Παράδειγµα του αρχείου εισόδου. 54
Statistics.txt Παράδειγµα του αρχείου Statistics.txt για το παραπάνω input file. Statistika stoixeia tis prosomoiosis ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FCFS -- Shortest Queue -- Equal Probabilities Total Simulation Time: 12745.6 Mean system utilization: 83.287% Mean interarrival time: 0.398232 Mean service time: 1.00885 --- Jobs --- Total Delays (Jobs): 32000 Jobs in System (when simulation ends): 6 Total Jobs: 32006 Mean Response Time: 4.98818 Max Response Time: 33.1537 --- Tasks --- Total Delays (Tasks): 336745 Tasks in System (when simulation ends): 16 Total Tasks: 336747 Mean Response Time: 3.09901 Mean queue length (mean jobs in system): 4.9887 Max queue Length (max number of jobs in system): 75 Server 1 ~~~~~~~~~~~ Utilization : 84.115% Mean waiting time in queue: 2.60534 Mean queue length: 2.11667 Total delays: 10355 Server 2 ~~~~~~~~~~~ Utilization : 84.3935% Mean waiting time in queue: 2.45502 Mean queue length: 2.06813 Total delays: 10737 Server 3 ~~~~~~~~~~~ Utilization : 83.2186% Mean waiting time in queue: 2.47928 Mean queue length: 2.04349 Total delays: 10505 Server 4 ~~~~~~~~~~~ Utilization : 83.6408% Mean waiting time in queue: 2.42268 Mean queue length: 2.01561 Total delays: 10604 Server 5 ~~~~~~~~~~~ Utilization : 83.5271% Mean waiting time in queue: 2.40906 Mean queue length: 1.99275 Total delays: 10543 55
Server 6 ~~~~~~~~~~~ Utilization : 83.1102% Mean waiting time in queue: 2.30288 Mean queue length: 1.9593 Total delays: 10844 Server 7 ~~~~~~~~~~~ Utilization : 83.4043% Mean waiting time in queue: 2.38223 Mean queue length: 1.94551 Total delays: 10409 Server 8 ~~~~~~~~~~~ Utilization : 83.1429% Mean waiting time in queue: 2.32864 Mean queue length: 1.91526 Total delays: 10483 Server 9 ~~~~~~~~~~~ Utilization : 83.1632% Mean waiting time in queue: 2.30375 Mean queue length: 1.88737 Total delays: 10442 Server 10 ~~~~~~~~~~~ Utilization : 82.345% Mean waiting time in queue: 2.25777 Mean queue length: 1.86973 Total delays: 10555 Server 11 ~~~~~~~~~~~ Utilization : 82.1295% Mean waiting time in queue: 2.26322 Mean queue length: 1.8421 Total delays: 10374 Server 12 ~~~~~~~~~~~ Utilization : 82.9584% Mean waiting time in queue: 2.22126 Mean queue length: 1.82433 Total delays: 10468 Server 13 ~~~~~~~~~~~ Utilization : 82.1522% Mean waiting time in queue: 2.20692 Mean queue length: 1.79627 Total delays: 10374 Server 14 ~~~~~~~~~~~ Utilization : 82.6759% Mean waiting time in queue: 2.13681 Mean queue length: 1.78062 Total delays: 10621 56
Server 15 ~~~~~~~~~~~ Utilization : 82.5479% Mean waiting time in queue: 2.12884 Mean queue length: 1.74843 Total delays: 10468 Server 16 ~~~~~~~~~~~ Utilization : 82.6622% Mean waiting time in queue: 2.10072 Mean queue length: 1.72137 Total delays: 10444 Server 17 ~~~~~~~~~~~ Utilization : 82.4297% Mean waiting time in queue: 2.08089 Mean queue length: 1.70365 Total delays: 10435 Server 18 ~~~~~~~~~~~ Utilization : 82.3741% Mean waiting time in queue: 2.08256 Mean queue length: 1.68982 Total delays: 10342 Server 19 ~~~~~~~~~~~ Utilization : 82.7055% Mean waiting time in queue: 2.00609 Mean queue length: 1.65328 Total delays: 10504 Server 20 ~~~~~~~~~~~ Utilization : 82.5463% Mean waiting time in queue: 1.9744 Mean queue length: 1.63227 Total delays: 10537 Server 21 ~~~~~~~~~~~ Utilization : 82.3708% Mean waiting time in queue: 1.95722 Mean queue length: 1.61638 Total delays: 10526 Server 22 ~~~~~~~~~~~ Utilization : 82.6328% Mean waiting time in queue: 1.95455 Mean queue length: 1.59102 Total delays: 10375 Server 23 ~~~~~~~~~~~ Utilization : 83.0389% Mean waiting time in queue: 1.91393 Mean queue length: 1.57147 Total delays: 10465 57
Server 24 ~~~~~~~~~~~ Utilization : 83.1515% Mean waiting time in queue: 1.90946 Mean queue length: 1.55881 Total delays: 10405 Server 25 ~~~~~~~~~~~ Utilization : 83.3898% Mean waiting time in queue: 1.89414 Mean queue length: 1.52996 Total delays: 10295 Server 26 ~~~~~~~~~~~ Utilization : 83.8271% Mean waiting time in queue: 1.78747 Mean queue length: 1.49442 Total delays: 10656 Server 27 ~~~~~~~~~~~ Utilization : 83.8243% Mean waiting time in queue: 1.83129 Mean queue length: 1.50218 Total delays: 10455 Server 28 ~~~~~~~~~~~ Utilization : 84.0582% Mean waiting time in queue: 1.79508 Mean queue length: 1.47952 Total delays: 10505 Server 29 ~~~~~~~~~~~ Utilization : 84.2833% Mean waiting time in queue: 1.74697 Mean queue length: 1.44562 Total delays: 10547 Server 30 ~~~~~~~~~~~ Utilization : 84.6907% Mean waiting time in queue: 1.68103 Mean queue length: 1.42495 Total delays: 10804 Server 31 ~~~~~~~~~~~ Utilization : 85.039% Mean waiting time in queue: 1.67137 Mean queue length: 1.41637 Total delays: 10801 Server 32 ~~~~~~~~~~~ Utilization : 85.6351% Mean waiting time in queue: 1.63067 Mean queue length: 1.39045 Total delays: 10868 58
Log_File.txt Το Log_File αποτελείται από πέντε στήλες: 1. Ο χρόνος που συµβαίνει το γεγονός 2. Ο τύπος του γεγονότος (άφιξη, αναχώρηση) 3. Η ουρά στην οποία εισάγεται το task αν πρόκειται για άφιξη ή η ουρά από την οποία αναχωρεί το task αν πρόκειται για αναχώρηση. 4. Ο χρόνος άφιξης του task στο σύστηµα. 5. O χρόνος εξυπηρέτησης του task. Όλες οι εγγραφές αναφέρονται σε tasks και όχι σε jobs. Για καλύτερη παρακολούθηση των jobs του συστήµατος, υπάρχουν επιπλέον εγγραφές που καταγράφουν τη χρονική στιγµή που έφτασε ένα job στο σύστηµα ή αναχώρησε από αυτό. Παράδειγµα: 59
Κεφάλαιο 5 ο Πειραματισμός και Ανάλυση της Απόδοσης Για τη µελέτη της απόδοσης του υπό εξέταση συστήµατος έχουν διεξαχθεί τρεις σειρές πειραµάτων. Κάθε σειρά εξετάζει µια διαφορετική παράµετρο απόδοσης. Έτσι η πρώτη σειρά αναφέρεται στο µέσο χρόνο απόκρισης, η δεύτερη στο µέγιστο χρόνο απόκρισης και η τρίτη στη µέση χρησιµοποίηση του συστήµατος. Για να καλυφθούν όλοι οι δυνατοί συνδυασµοί αλγορίθµων, η κάθε σειρά χωρίζεται σε πειράµατα ανάλογα µε τον µέσο αριθµό των tasks ανά διεργασία. Κάθε πείραµα περιλαµβάνει µια σειρά από εκτελέσεις του προγράµµατος (συνήθως 12 runs) και από αυτές προκύπτουν δύο διαγράµµατα (ένα για κάθε αλγόριθµο επιλογής ουράς, Random / Shortest Queue ) από τα οποία µπορούν να διεξαχθούν συµπεράσµατα για την απόδοση των αλγορίθµων δροµολόγησης, STF και FCFS. Σε όλα τα πειράµατα ο µέσος χρόνος εξυπηρέτησης είναι 1 και το πρόγραµµα τερµατίζει µόλις αναχωρήσει και το 32000στό job από το σύστηµα. Σε κάθε πείραµα, το πρόγραµµα εκτελείται για 3 διαφορετικούς ρυθµούς άφιξης των διεργασιών (λ). Για να µπορεί να γίνει η σύγκριση, οι ρυθµοί άφιξης που χρησιµοποιούνται σε όλες τις σειρές πειραµάτων είναι τέτοιοι ώστε η χρησιµοποίηση να παραµένει η ίδια. 60
5.1 1 η Σειρά Πειραµάτων Mean Response Time Η πρώτη σειρά πειραµάτων εξετάζει το µέσο χρόνο απόκρισης του συστήµατος για διαφορετικό φόρτο εργασίας και για όλες τις πιθανές περιπτώσεις (καλύπτονται όλοι οι δυνατοί συνδυασµοί αλγορίθµων). Στα διαγράµµατα γίνεται σύγκριση των δύο αλγορίθµων δροµολόγησης (STF- FCFS). Στην πρώτη σειρά πειραµάτων γίνονται 3 πειράµατα ανάλογα µε το µέσο αριθµό των tasks των διεργασιών. 5.1.1 Πείραµα 1α Equal Probabilities (Κάθε job μπορεί να έχει 1, 2, 4, 8, 16, 32 tasks με ίση πιθανότητα εμφάνισης Το πρόγραµµα εκτελείται 12 φορές. Ο αριθµός των tasks που µπορεί να έχει κάθε job (1, 2, 4, 8, 16, 32 tasks µε ίση πιθανότητα εµφάνισης) µένει σταθερός και γίνεται σύγκριση των αλγορίθµων FCFS, STF για την περίπτωση που έχουµε Shortest Queue ή Random Queue πάντα όσον αφορά τη µέση απόκριση του συστήµατος (mean response time). λ = 2.3 4,067 4,276 λ = 2.3 180 23 λ = 2.5 4,988 5,498 λ = 2.5 379 35 λ = 2.7 7,214 8,599 λ = 2.7 611 64 Παρατηρήσεις Χρησιµοποιώντας τον αλγόριθµο shortest queue, ο FCFS είναι ελάχιστα καλύτερος του STF για όλα τα λ ( ο µέσος χρόνος απόκρισης είναι µικρότερος µε τη χρήση του FCFS), ενώ για τυχαία επιλογή ουράς (Random Queue), ο STF δείχνει κατά πολύ καλύτερος του FCFS. 61
Στα παρακάτω διαγράµµατα φαίνεται ακριβώς το ποσοστό βελτίωσης της απόδοσης µε τη χρήση του FCFS στην πρώτη περίπτωση (Shortest Queue) και το ποσοστό µείωσης της απόδοσης µε τη χρήση του ίδιου αλγόριθµου αλλά για Random Queue (επιλογή τυχαίας ουράς). Με πράσινο συµβολίζεται τη αύξηση της απόδοσης και µε µπλε η µείωση. Ο FCFS θεωρείται πάντα η βάση και εξάγονται τα στατιστικά αποτελέσµατα. Παρατηρήσεις Στο πρώτο διάγραµµα ο FCFS είναι µέχρι και 19% καλύτερος σε σχέση µε τον STF ( για λ=2.7 ). Επίσης όσο µεγαλύτερο είναι το λ, ο ρυθµός άφιξης, δηλαδή, των διεργασιών στο σύστηµα τόσο καλύτερα αποδίδει ο FCFS (τόσο µικρότερος είναι ο µέσος χρόνος απόκρισης σε σχέση µε τον STF). Αντίθετα, όπως φαίνεται από το δεύτερο διάγραµµα, όταν έχουµε τυχαία επιλογή ουράς ο FCFS είναι µέχρι και 90% χειρότερος από τον STF. 62
5.1.2 Πείραµα 1β Non equal Probabilities (Κάθε job μπορεί να έχει 1, 2, 4, 8 tasks με 80% πιθανότητα εμφάνισης και 16, 32 με 20% πιθανότητα Τρέχουµε το πρόγραµµα 12 φορές. Κρατάµε σταθερό τον αριθµό των tasks που µπορεί να έχει κάθε job ( 1, 2, 4, 8 tasks µε 80% πιθανότητα εµφάνισης και 16, 32 µε 20% πιθανότητα ) και συγκρίνουµε τους αλγορίθµους FCFS, STF όσον αφορά τη µέση απόκριση του συστήµατος (mean response time) για δύο περιπτώσεις: Shortest Queue και Random Queue. λ=3.096 λ=3.365 λ=3.634 λ=3.096 λ=3.365 λ=3.634 λ = 3.096 3,47 3,55 λ = 3.365 4 4,48 λ = 3.634 6,055 6,47 λ = 3.096 113 16,69 λ = 3.365 233 25 λ = 3.634 382 40 Παρατηρούµε ότι παίρνουµε ανάλογα αποτελέσµατα µε το πείραµα 1α παρόλο που εδώ ο αριθµός των tasks που θα έχει κάθε job καθορίζεται βάσει πιθανοτήτων (80% πιθανότητα να έχει 1, 2, 4, 8 tasks και 20% πιθανότητα για 16 και 32 tasks). Με τον αλγόριθµο αυτό στο σύστηµα έρχονται λιγότερα tasks σε σχέση µε την πρώτη περίπτωση (για ίδιο ρυθµό άφιξης εργασιών). Γι αυτό και χρησιµοποιούµε µεγαλύτερα λ έτσι ώστε η χρησιµοποίηση του συστήµατος να παραµένει η ίδια. Και πάλι ο FCFS είναι καλύτερος από τον STF όσον αφορά το Mean Response Time όταν έχουµε επιλογή της µικρότερης ουράς (Shortest Queue), ενώ ο STF είναι καλύτερος όταν έχουµε τυχαία επιλογή ουράς (Random Queue). 63
Το πόσο καλύτερος / χειρότερος είναι ο FCFS σε σχέση µε τον STF για κάθε µία από της δύο περιπτώσεις φαίνεται στα παρακάτω διαγράµµατα: Στο πείραµα 1α για Shortest Queue ο FCFS ήταν µέχρι και 19% καλύτερος από τον STF. Εδώ η βελτίωση της απόδοσης µε τη χρήση του FCFS είναι 6,85% στην καλύτερη περίπτωση. Για Random Queue, τα αποτελέσµατα είναι παρόµοια µε το πείραµα 1α. Ο FCFS είναι πολύ χειρότερος σε σχέση µε τον STF µέχρι και 89,64%. 64
5.1.3 Πείραµα 1γ Non equal Probabilities (Κάθε job μπορεί να έχει 1, 2, 4, 8 tasks με 90% πιθανότητα εμφάνισης και 16, 32 με 10% πιθανότητα Τρέχουµε πάλι το πρόγραµµα 12 φορές. Κρατάµε σταθερό τον αριθµό των tasks που µπορεί να έχει κάθε Job ( 1, 2, 4, 8 tasks µε 90% πιθανότητα εµφάνισης και 16, 32 µε 10% πιθανότητα ) και συγκρίνουµε τους αλγορίθµους FCFS, STF όσον αφορά τη µέση απόκριση του συστήµατος (mean response time) για δύο περιπτώσεις: Shortest Queue και Random Queue. λ = 4.18 2,93 2,95 λ = 4.18 69 10,62 λ = 4.54 3,45 3,49 λ = 4.54 140 16 λ = 4.9 4,58 4,59 λ = 4.9 234 25 Και εδώ χρησιµοποιούµε διαφορετικό ρυθµό άφιξης (λ) έτσι ώστε η χρησιµοποίηση του συστήµατος να παραµένει η ίδια µε τα προηγούµενα πειράµατα. Και πάλι παρατηρούµε ότι ο FCFS είναι ελάχιστα καλύτερος όταν έχουµε Shortest Queue, ενώ ο STF ενδείκνυται για τις περιπτώσεις που έχουµε Random Queue. 65
Στα παρακάτω διαγράµµατα συγκρίνουµε τον FCFS σε σχέση µε τον STF για κάθε µία από της δύο περιπτώσεις. Παρατηρούµε ότι σε αυτήν την περίπτωση ο FCFS είναι ελάχιστα καλύτερος σε σχέση µε τον STF. Έτσι ενώ στο πρώτο πείραµα είχαµε µέχρι και 19% βελτίωση, στο δεύτερο 6,85% εδώ έχουµε το πολύ 1,24%. Για Random Queue ο FCFS συνεχίζει να είναι πολύ χειρότερος του STF µε ποσοστό που αγγίζει το 89%. 66
5.2 εύτερη σειρά Πειραµάτων Max Response Time Στη δεύτερη σειρά πειραµάτων εξετάζουµε το µέγιστο χρόνο απόκρισης του συστήµατος για διαφορετικό φόρτο εργασίας και για όλες τις πιθανές περιπτώσεις (καλύπτονται όλοι οι δυνατοί συνδυασµοί αλγορίθµων). Στα διαγράµµατα γίνεται σύγκριση των δύο αλγορίθµων δροµολόγησης (STF- FCFS). Στην πρώτη σειρά πειραµάτων γίνονται 3 πειράµατα ανάλογα µε το µέσο αριθµό των tasks των διεργασιών. 5.2.1 Πείραµα 2α Equal Probabilities (Κάθε job μπορεί να έχει 1, 2, 4, 8, 16, 32 tasks με ίση πιθανότητα εμφάνισης Τρέχουµε το πρόγραµµα 12 φορές. Κρατάµε σταθερό τον αριθµό των tasks που µπορεί να έχει κάθε Job (1, 2, 4, 8, 16, 32 tasks µε ίση πιθανότητα εµφάνισης) και συγκρίνουµε τους αλγορίθµους FCFS, STF για την περίπτωση που έχουµε Shortest Queue ή Random Queue πάντα όσον αφορά τη µέγιστη απόκριση του συστήµατος (max response time). Shortest Queue λ=2.3 28 85 λ = 2.5 33 223 λ = 2.7 46 423 Για shortest queue παρατηρούµε ότι το max response time όταν χρησιµοποιούµε τον STF είναι πολύ µεγαλύτερο σε σχέση µε τον FCFS. Επίσης όσο µεγαλύτερο το λ ( ο αριθµός τον jobs που φτάνουν στο σύστηµα στη µονάδα του χρόνου ) τόσο µεγαλύτερο είναι και το max response time του συστήµατος. 67
Random Queue λ=2.3 1.062 8.205 λ = 2.5 1.949 10.213 λ = 2.7 2.712 10.493 Για random queue παρατηρούµε ότι το max response time του STF είναι πάντα πολύ µεγαλύτερο σε σχέση µε εκείνο του FCFS. Αυτό ίσως φανεί παράξενο αν αναλογιστούµε ότι ο µέσος ρυθµός απόκρισης του συστήµατος στην ίδια περίπτωση είναι πολύ µικρότερος µε τη χρήση του STF. Καθώς όµως ο STF επιλέγει για εξυπηρέτηση το task µε το µικρότερο χρόνο εκτέλεσης είναι λογικό κατά µέσο όρο τα jobs να εκτελούνται γρήγορα για random queue. Όµως εάν κάποιο task έχει µεγάλο χρόνο εκτέλεσης, αυτό θα καθυστερήσει την εκτέλεση ολόκληρου του job. Γενικά ο STF είναι πολύ αποδοτικός όταν το κάθε job έχει µόνο ένα task. Στην περίπτωση πολλαπλών task αυξάνεται η πολυπλοκότητα του συστήµατος. Ωστόσο ο αλγόριθµος συνεχίζει να είναι η καλύτερη επιλογή για την περίπτωση που έχουµε Random Queue, όπως φαίνεται και από την πρώτη σειρά πειραµάτων. 68