ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ
ΘΕΩΡΙΑ
ΘΕΩΡΙΑ
3: Διεργασίες, Διαδιεργασιακή Επικοινωνία και Χρονοπρογραμματισμός
- Διεργασίες (Processes):
o Οι διεργασίες συνιστούν τον κύριο μηχανισμό με τον οποίο τα σύγχρονα λειτουργικά συστήματα ελέγχουν τα εκτελούμενα προγράμματα.
o Μία διεργασία είναι το στιγμιότυπο ενός προγράμματος το οποίο εκτελείται, την ώρα που εκτελείται. Κατ’ αντιδιαστολή, το πρόγραμμα είναι απλώς ένα στατικό σύνολο εντολών. Επομένως αν ο χρήστης εκκινήσει δύο φορές το ίδιο πρόγραμμα, δημιουργούνται δύο διαφορετικές διεργασίες.
o Μία διεργασία καταλαμβάνει κάποιον χώρο στην κύρια μνήμη, τον οποίον δεσμεύει το λειτουργικό σύστημα για λογαριασμό της. Ο χώρος αυτός διαιρείται σε επιμέρους τμήματα στα οποία αποθηκεύονται διαφορετικά δεδομένα:
1) Ο κώδικας του προγράμματος, μία αλληλουχία δυαδικών εντολών
2) Ένας ακέραιος αριθμός ο οποίος χαρακτηρίζει τη διεργασία
3) Oι τρέχουσες τιμές των καθολικών μεταβλητών του εκτελούμενου προγράμματος
4) Oι τρέχουσες τιμές των τοπικών μεταβλητών του εκτελούμενου προγράμματος
5) Στοιχεία για τους πόρους που χρησιμοποιεί την τρέχουσα στιγμή η διεργασία (π.χ. ανοιχτά αρχεία)
6) Ο μετρητής προγράμματος: ένας δείκτης στη διεύθυνση μνήμης του τμήματος κώδικα, η οποία περιέχει την επόμενη προς εκτέλεση εντολή. Η εντολή αυτή πρέπει να μεταβιβαστεί αμέσως στον επεξεργαστή μέσω του διαύλου, εκτός κι αν στο μεταξύ παγώσει η εκτέλεση της διεργασίας.
7) Άλλα στοιχεία
o Μία διεργασία δεν μπορεί να προσπελάσει μνήμη άλλης διεργασίας. Σε συνηθισμένο ρυθμό λειτουργίας, η μία διεργασία είναι αόρατη για την άλλη ακόμα και όταν εκτελούνται ψευδοπαράλληλα / παράλληλα. Το χαρακτηριστικό αυτό, το οποίο προστατεύει τις διεργασίες από δυσάρεστες μεταξύ τους παρεμβολές αλλά και τον πυρήνα από την παρεμβολή κάποιας διεργασίας, ονομάζεται προστασία μνήμης.
o Όπως είναι φανερό, μία διεργασία αποτελείται από τον κώδικα του εκτελούμενου προγράμματος συν την κατάστασή του, δηλαδή το σύνολο των δεδομένων που σχετίζονται με τη λειτουργία του κατά την τρέχουσα στιγμή της εκτέλεσής του. Ο κώδικας παραμένει αμετάβλητος αλλά η κατάσταση αλλάζει συνεχώς, όσο προχωρά η εκτέλεση της διεργασίας.
o Ο πυρήνας διατηρεί κάποιες εσωτερικές δομές δεδομένων (συνήθως λίστες ή ουρές) στη μνήμη του, με αποθηκευμένα στοιχεία για όλες τις ενεργές διεργασίες την τρέχουσα στιγμή. Έτσι το ΛΣ χειρίζεται τις διεργασίες.
- Καταστάσεις διεργασιών:
o Κάθε στιγμή μία ενεργή διεργασία βρίσκεται σε κάποια κατάσταση. Η ακριβής φύση αυτής της κατάστασης αποθηκεύεται σε κατάλληλη εγγραφή των ανάλογων δομών δεδομένων του πυρήνα.
o Οι πιθανές καταστάσεις είναι συνήθως οι εξής:
8) Νέα: Η διεργασία έχει μόλις δημιουργηθεί και δεν έχει ξεκινήσει η εκτέλεσή της.
9) Εκτελούμενη: Κατά την τρέχουσα στιγμή η διεργασία εκτελείται, έχει επομένως τον έλεγχο του επεξεργαστή.
10)Εν αναμονή: Η εκτέλεση της διεργασίας έχει ανασταλεί επειδή περιμένει κάποια δεδομένα εισόδου (π.χ. τα περιεχόμενα ενός αρχείου από τον δίσκο), ή την ολοκλήρωση από το υλικό μίας διαδικασίας εξόδου που ζητήθηκε (π.χ. εκτύπωση). Αυτό σημαίνει συνήθως πως η διεργασία έχει παγώσει κατά την εκτέλεση κάποιας κλήσης συστήματος και αναμένει την επιστροφή της τελευταίας. Προς το παρόν ο έλεγχος του επεξεργαστή έχει περάσει σε άλλη διεργασία ή στον πυρήνα.
11)Έτοιμη: Η διεργασία προς το παρόν δεν εκτελείται και ο έλεγχος του επεξεργαστή έχει δοθεί αλλού, αλλά η εκτέλεση του προγράμματος δεν έχει ανασταλεί. Μόλις της δοθεί το κατάλληλο σήμα από τον πυρήνα, η διεργασία μπορεί άμεσα να συνεχίσει την εκτέλεσή της από εκεί που πάγωσε τελευταία φορά.
12)Τερματισμένη: Η εκτέλεση του κώδικα της διεργασίας έχει τελειώσει και απλώς έχει παραμείνει η εγγραφή της τελευταίας στις δομές δεδομένων του πυρήνα. Πολύ σύντομα η εγγραφή αυτή πρέπει να διαγραφεί.
- Διαδιεργασιακή Επικοινωνία (IPC, Inter-Process Communication):
o Διαδιεργασιακή επικοινωνία ονομάζεται ένα σύνολο μηχανισμών που παρέχουν τα λειτουργικά συστήματα, οι οποίοι διευκολύνουν την ανταλλαγή δεδομένων και τον συγχρονισμό μεταξύ ταυτοχρόνως εκτελούμενων διεργασιών, με τη μεσολάβηση δομών δεδομένων του πυρήνα.
o Τέτοιοι μηχανισμοί είναι απαραίτητοι στα μοντέρνα λειτουργικά συστήματα όπου κάθε διεργασία έχει τον δικό της ιδιωτικό χώρο διευθύνσεων μνήμης, στον οποίον έχει πρόσβαση μόνο αυτή και ο πυρήνας ώστε να υπάρχει μία στοιχειώδης προστασία μνήμης. Αν επομένως χρειάζεται δύο διαφορετικές διεργασίες να επικοινωνήσουν μεταξύ τους ή να ανταλλάξουν δεδομένα, αυτό μπορεί να γίνει μόνο μέσω του συστήματος αρχείων (π.χ. μία διεργασία να γράψει ένα αρχείο στον δίσκο και μία άλλη να το διαβάσει) ή μέσω μίας μεθόδου διαδιεργασιακής επικοινωνίας.
o Με το προγραμματιστικό μοντέλο των υποδοχών (sockets) οι διεργασίες οι οποίες επικοινωνούν μπορούν να εκτελούνται σε διαφορετικούς υπολογιστές που διασυνδέονται μέσω ενός δικτύου. Στην πραγματικότητα κάθε πρόγραμμα το οποίο επικοινωνεί με άλλα μέσω δικτύου υπολογιστών (π.χ. του Διαδικτύου), στηρίζεται στη διαδιεργασιακή επικοινωνία που παρέχουν οι υποδοχές.
o Υπάρχουν αρκετοί ακόμα τύποι διαδιεργασιακής επικοινωνίας: κοινή μνήμη (shared memory), σωληνώσεις (pipes) κλπ. Τόσο αυτοί όσο και οι υποδοχές είναι προσπελάσιμες από τους προγραμματιστές μέσω κλήσεων συστήματος που παρέχουν τα ΛΣ. Επομένως ο κώδικας εφαρμογών οι οποίες επικοινωνούν και ανταλλάσσουν δεδομένα μεταξύ τους, πρέπει να έχει γραφεί καταλλήλως από κάποιον προγραμματιστή.
o Ο κώδικας αυτός δεν είναι φορητός μεταξύ διαφορετικών ΛΣ, λόγω διαφορετικών συμβάσεων ως προς τη λειτουργικότητα των μηχανισμών διαδιεργασιακής επικοινωνίας και τη σύνταξη και σημασιολογία των αντίστοιχων κλήσεων συστήματος. Άρα ένα πρόγραμμα το οποίο αξιοποιεί τη διαδιεργασιακή επικοινωνία, πρέπει να γραφεί και να μεταγλωττιστεί εκ νέου για να τρέξει σε άλλο λειτουργικό σύστημα.
- Ιεραρχίες Διεργασιών:
o Σε πολλές περιπτώσεις ένα εκτελούμενο πρόγραμμα (η μητρική ή γονική διεργασία) δημιουργεί δευτερεύουσες (θυγατρικές) διεργασίες ώστε να εκμεταλλευτεί πιθανά οφέλη από την ταυτόχρονη εκτέλεσή τους. Αυτό το επιτυγχάνει μέσω κατάλληλων κλήσεων συστήματος στον κώδικά του, τις οποίες εξυπηρετεί ο πυρήνας.
o Με αυτόν τον τρόπο, σε ένα παράλληλο σύστημα οι υπολογισμοί που απαιτούνται από μία εφαρμογή μπορούν να κατανεμηθούν σε πολλαπλούς επεξεργαστές, με τον καθένα να εκτελεί διαφορετική διεργασία. Σε ένα σειριακό σύστημα, αν μία διεργασία ανασταλεί (π.χ. σε μία κλήση συστήματος) καθώς περιμένει την απελευθέρωση ενός πόρου (π.χ. πρόσβαση στον σκληρό δίσκο) ή μία είσοδο από τον χρήστη (π.χ. από το πληκτρολόγιο), κάποια άλλη διεργασία μπορεί να συνεχίσει τους υπολογισμούς.
o Είναι φανερό επομένως ότι η διαδιεργασιακή επικοινωνία δεν είναι απαραίτητη μόνο για την ανταλλαγή δεδομένων μεταξύ ανεξάρτητων διεργασιών, αλλά και για τον συντονισμό στενά συνεργαζόμενων διεργασιών οι οποίες εκτελούνται παράλληλα (αν είναι διαθέσιμοι περισσότεροι από ένας επεξεργαστές) ή ψευδοπαράλληλα (αν είναι διαθέσιμος μόνο ένας επεξεργαστής). Ωστόσο η κατασκευή μίας διεργασίας κοστίζει σε χρόνο και σε χώρο μνήμης, αφού πρέπει να δεσμευτεί πολύς χώρος και να τροποποιηθούν πολλαπλές εσωτερικές δομές δεδομένων του πυρήνα.
o Σε ορισμένα ΛΣ (κυρίως στις ποικίλες παραλλαγές του Unix) μία γονική διεργασία πρέπει να περιμένει τον τερματισμό όλων των θυγατρικών της διεργασιών πριν τερματίσει και η ίδια. Διαφορετικά οι τελευταίες παραμένουν ανενεργές στη μνήμη, καταλαμβάνοντας απλώς χώρο στις δομές δεδομένων του πυρήνα («διεργασίες ζόμπι»).
- Χρονοπρογραμματισμός (Scheduling):
o Χρονοπρογραμματισμός ονομάζεται η χαρακτηριστική δυνατότητα των λειτουργικών συστημάτων, υλοποιούμενη συνήθως από έναν μηχανισμό του πυρήνα ονόματι χρονοπρογραμματιστής, με την οποία συντονίζεται η συνύπαρξη πολλαπλών εκτελούμενων διεργασιών στη μνήμη του υπολογιστή. Με τον χρονοπρογραμματισμό επιτυγχάνεται επομένως η πολυδιεργασία καθώς, είτε με κατάλληλη κατανομή του χρόνου του μοναδικού επεξεργαστή (ψευδοπαράλληλη εκτέλεση) είτε λόγω της ύπαρξης περισσοτέρων του ενός επεξεργαστών (παράλληλη εκτέλεση), είναι εφικτή η ταυτόχρονη εκτέλεση πολλαπλών διεργασιών στον ίδιο υπολογιστή.
o Στα σύγχρονα προεκτοπιστικά ή διακοπτά (preemptive) λειτουργικά συστήματα, στον επεξεργαστή συμβαίνει αυτόματη εναλλαγή διεργασιών ανά τακτά χρονικά διαστήματα (στην αρχή κάθε «χρονικού κβάντου») ώστε να επιτευχθεί η ψευδοπαράλληλη εκτέλεση πολλαπλών διεργασιών. Οι διεργασίες εναλλάσσονται στον επεξεργαστή με εξαιρετικά μεγάλη συχνότητα (συνήθως το κβάντο διαρκεί το πολύ κάποιες εκατοντάδες millisecond).
o Η εναλλαγή αυτή ονομάζεται θεματική εναλλαγή (context switch) και, προκειμένου να είναι εφικτή, πρέπει όλες οι πληροφορίες που είναι αποθηκευμένες στην τοπική μνήμη του επεξεργαστή (στους καταχωρητές) για την εκτελούμενη διεργασία, να αποθηκευτούν σε μία περιοχή κάπου στην κύρια μνήμη RAM κατά τη θεματική εναλλαγή. Έτσι, όταν έρθει ξανά η σειρά αυτής της διεργασίας να εκτελεστεί, θα μπορούν να φορτωθούν πάλι πίσω στους καταχωρητές και η εκτέλεση να συνεχίσει από εκεί που σταμάτησε. Αυτή η περιοχή είναι ένα καταλλήλως δεσμευμένο (από το ΛΣ) τμήμα του χώρου μνήμης της ίδιας της διεργασίας.
o Τα πρώτα ΛΣ πολυπρογραμματισμού, αλλά και τα πρώτα ΛΣ μικροϋπολογιστών με πολυδιεργασία, δεν ήταν προεκτοπιστικά: οι εφαρμογές έπρεπε να έχουν γραφεί έτσι ώστε οι ίδιες, μέσω του κώδικά τους, να ζητούν ανά τακτά χρονικά διαστήματα το πάγωμά τους. Επομένως ήταν αναγκαίο οι εφαρμογές να έχουν γραφεί καταλλήλως ώστε να μπορούν να συνεργάζονται και να εναλλάσσονται ομαλά (συνεργατικός, μη διακοπτός ή μη προεκτοπιστικός χρονοπρογραμματισμός).
o Ο χρονοπρογραμματιστής ενός ΛΣ είναι διαρκώς ενεργός στο υπόβαθρο. Εκτελείται για κάποιο μικρό χρονικό διάστημα στο τέλος κάθε κβάντου, προκειμένου να επιλέξει ποια είναι η επόμενη διεργασία την οποία θα «ξεπαγώσει» για να της επιτρέψει να εκτελεστεί (να αποκτήσει τον έλεγχο του επεξεργαστή). Επιπρόσθετα, ο απαιτούμενος για την ίδια τη θεματική εναλλαγή χρόνος είναι ουσιαστικά χαμένος χρόνος, μία επιβάρυνση για το σύστημα αφού κατά τη διάρκεια αυτής της διαδικασίας δεν εκτελούνται υπολογισμοί των χρηστών. Το πόσο μεγάλος θα είναι αυτός ο χρόνος εξαρτάται από την υποστήριξη που παρέχει το υλικό (π.χ. ειδικές εντολές για διευκόλυνση της θεματικής εναλλαγής) και από την πολυπλοκότητα της υλοποίησης του χρονοπρογραμματιστή.
o Συνολικά, ο χρονοπρογραμματισμός εισάγει κάποια επιβάρυνση (επιβάρυνση χρονοπρογραμματισμού), αφού ένα τμήμα του χρόνου του επεξεργαστή – συνήθως μικρό αλλά όχι αμελητέο – δαπανάται όχι για την «ωφέλιμη» εκτέλεση εφαρμογών χρήστη, αλλά για να είναι εφικτή η πολυδιεργασία.
- Αλγόριθμοι χρονοπρογραμματισμού:
o Το ποια διεργασία εκτελείται κάθε στιγμή καθορίζεται από τον χρονοπρογραμματιστή του συστήματος, η συμπεριφορά του οποίου συνήθως δεν μπορεί να προβλεφθεί ή να τροποποιηθεί από τον χρήστη. Προκειμένου να λειτουργεί αυτός ο μηχανισμός, εσωτερικά ο πυρήνας διατηρεί λίστες με εκτελούμενες, έτοιμες και εν αναμονή διεργασίες (οι εκτελούμενες κάθε στιγμή μπορούν να είναι περισσότερες από μία, αν είναι διαθέσιμοι τουλάχιστον δύο επεξεργαστές).
o Η μετάβαση μίας διεργασίας από τη μία κατάσταση στην άλλη λαμβάνει χώρα αυτόματα, μέσω του μηχανισμού εναλλαγής που χρησιμοποιεί ο χρονοπρογραμματιστής, ενώ ο τελευταίος μπορεί να ακολουθεί διάφορους αλγορίθμους χρονοπρογραμματισμού για να λαμβάνει αποφάσεις κατανομής του χρόνου του επεξεργαστή σε εκτελούμενα προγράμματα. Ο κάθε αλγόριθμος έχει διαφορετικές ιδιότητες και επιφέρει διαφορετική χρονική επιβάρυνση.
o Οι κυριότερες ιδιότητες οι οποίες χαρακτηρίζουν έναν αλγόριθμο χρονοπρογραμματισμού είναι οι εξής:
o Οι συνηθέστεροι αλγόριθμοι χρονοπρογραμματισμού είναι οι εξής:
o Ορισμένες εξειδικευμένες εφαρμογές έχουν απαιτήσεις λειτουργίας οι οποίες απαιτούν την τήρηση χρονικών προθεσμιών, δηλαδή πρέπει να τερματιστούν απαραιτήτως εντός συγκεκριμένου χρονικού ορίου («συστήματα πραγματικού χρόνου»). Σε συνθήκες πολυδιεργασίας τέτοιες εγγυήσεις συνήθως δεν είναι εφικτό να δοθούν από το λειτουργικό σύστημα, υπάρχουν όμως εξειδικευμένοι αλγόριθμοι πραγματικού χρόνου προς αυτό τον σκοπό.
o Οι κυριότερες ιδιότητες οι οποίες χαρακτηρίζουν έναν αλγόριθμο χρονοπρογραμματισμού είναι οι εξής:
- Διαμεταγωγή (throughput): Πόσες διεργασίες ολοκληρώνουν την εκτέλεσή τους στη μονάδα του χρόνου.
- Χρόνος απόκρισης (response time): Ο απαιτούμενος χρόνος που μεσολαβεί μεταξύ της αρχικής υποβολής μίας διεργασίας και της πρώτης ενεργοποίησής της.
- Ακριβοδικία (fairness): Κατά πόσον αποδίδεται ίσος χρόνος επεξεργαστή σε όλες τις διεργασίες.
- Χρόνος υστέρησης (latency): Ο απαιτούμενος χρόνος που μεσολαβεί μεταξύ της αρχικής υποβολής μίας διεργασίας και της ολοκλήρωσής της.
o Οι συνηθέστεροι αλγόριθμοι χρονοπρογραμματισμού είναι οι εξής:
- First In First Out (FIFO), ή First Come First Served (FCFS): Οι διεργασίες ενεργοποιούνται και εκτελούνται με τη σειρά με την οποία υποβάλλονται. Καμία διεργασία δεν διακόπτεται ποτέ για να εκτελεστεί κάποια άλλη και οι μόνες στιγμές που πρέπει να ληφθεί μία απόφαση χρονοπρογραμματισμού είναι κατά τον τερματισμό μίας διεργασίας. Προφανώς η πολυδιεργασία δεν είναι εφικτή και επομένως ο αλγόριθμος αυτός δεν είναι καθόλου κατάλληλος για αλληλεπιδραστικά συστήματα.
- Shortest Job First (SJF): Κάθε στιγμή εκτελούμενη είναι η διεργασία για την οποία υπάρχει εκτίμηση ότι πρόκειται να ολοκληρώσει τη λειτουργία της και να τερματιστεί συντομότερα από τις άλλες. Αυτό σημαίνει ότι μπορεί να συμβεί θεματική εναλλαγή αν ξαφνικά υποβληθεί μία νέα διεργασία με μικρότερο απαιτούμενο χρόνο εκτέλεσης από την τρέχουσα. Στόχος είναι η μεγιστοποίηση της διαμεταγωγής.
- Round Robin ή Εκ Περιτροπής (RR): Όλες οι διεργασίες εκτελούνται διαδοχικά και κυκλικά, για ένα κβάντο χρόνου την κάθε φορά. Το κβάντο είναι πάντα σταθερού μήκους. Η διαμεταγωγή του RR ισορροπεί μεταξύ των SJF και FIFO, ενώ ο αλγόριθμος έχει τον μικρότερο χρόνο απόκρισης απ' όλους. Είναι ο πλέον κατάλληλος για αλληλεπιδραστικά συστήματα πολυδιεργασίας και ο πιο ακριβοδίκαιος, αλλά χαρακτηρίζεται από πολύ υψηλή επιβάρυνση χρονοπρογραμματισμού λόγω των τακτικότατων θεματικών εναλλαγών.
- Προτεραιοτήτων: Το ΛΣ αναθέτει μία ακέραια τιμή προτεραιότητας σε κάθε διεργασία και πρώτα εκτελούνται οι διεργασίες με τη μεγαλύτερη προτεραιότητα. Θεματική εναλλαγή μπορεί να συμβεί μόνο στον τερματισμό μίας διεργασίας, ή αν ξαφνικά υποβληθεί μία νέα διεργασία με μεγαλύτερη προτεραιότητα από την τρέχουσα.
o Ορισμένες εξειδικευμένες εφαρμογές έχουν απαιτήσεις λειτουργίας οι οποίες απαιτούν την τήρηση χρονικών προθεσμιών, δηλαδή πρέπει να τερματιστούν απαραιτήτως εντός συγκεκριμένου χρονικού ορίου («συστήματα πραγματικού χρόνου»). Σε συνθήκες πολυδιεργασίας τέτοιες εγγυήσεις συνήθως δεν είναι εφικτό να δοθούν από το λειτουργικό σύστημα, υπάρχουν όμως εξειδικευμένοι αλγόριθμοι πραγματικού χρόνου προς αυτό τον σκοπό.
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
Αφήστε το σχόλιό σας για την τρέχουσα ανάρτηση: