Διδακτικά Βιβλία του Παιδαγωγικού Ινστιτούτου

Αναζήτηση

Βρες
Εμφάνιση

Ελαφρές διεργασίες

Κάθε ΛΣ αποτελείται από πολλά επί μέρους προγράμματα, τα οποία εκτελούνται παράλληλα για να εξυπηρετούν τους χρήστες, είναι δηλαδή και αυτό χωρισμένο σε διεργασίες. Το ίδιο μπορεί να γίνει και με τα προγράμματα των χρηστών, να διαιρεθούν δηλαδή σε τμήματα τα οποία εκτελούνται παράλληλα.

Ο ζαχαροπλάστης (ΚΜΕ) αφιερώνει 5' κάθε φορά στην εκτέλεση μιας συνταγής. Αυτά τα 5' μπορεί να τα μοιράσει σε 5 τμήματα του 1' το καθένα. Σε κάθε τέτοιο τμήμα του 1' μπορεί να ασχοληθεί σε κάθε τμήμα με ένα διαφορετικό στοιχείο του γλυκού το οποίο είναι ανεξάρτητο από τα άλλα. Έτσι μπορεί π.χ. να παρακολουθεί το ψήσιμο της ζύμης στο φούρνο και να ανακατεύει την κρέμα που βράζει.

Όταν όμως τα τμήματα αυτά πρέπει να μοιράζονται διάφορα στοιχεία του προγράμματος, όπως π.χ. μεταβλητές, μπορεί να χρησιμοποιηθεί και ένα εναλλακτικό είδος διεργασιών, οι ελαφρές διεργασίες (lightweight processes) ή νήματα εκτέλεσης (threads of execution) ή απλούστερα νήματα (threads).

Τα νήματα έχουν πολλές ομοιότητες με τις διεργασίες και μια βασική διαφορά: χρησιμοποιούν από κοινού ένα τμήμα μνήμης, στο οποίο έχουν όλα πρόσβαση.

Όπως για κάθε διεργασία, έτσι και για κάθε νήμα το ΛΣ κρατά ένα σύνολο από πληροφορίες σε μια ειδική περιοχή της μνήμης, η οποία αποκαλείται Σύνολο Ελέγχου Νήματος (Thread Control Block) ή αλλιώς ΣΕΝ (TCB). Το ΣΕΝ κρατά τις απαραίτητες πληροφορίες για κάθε νήμα, αλλά όσες πληροφορίες είναι κοινές μεταξύ τους (π.χ. αυτές για τη μοιραζόμενη μνήμη) καταγράφονται μια φορά μόνο.

Ο ζαχαροπλάστης πρέπει να θυμάται ή να καταγράφει την πρόοδο για κάθε στάδιο μιας συνταγής που εκτελείται παράλληλα με άλλα στάδια της εκτέλεσής της. Τα σκεύη όμως και τα υλικά που αφορούν τα διάφορα στάδια τα τοποθετεί στο ίδιο μέρος, εκείνο που έχει καθορίσει για τη συγκεκριμένη συνταγή.

Όταν ένα πρόγραμμα διαιρεθεί σε νήματα που εκτελούνται «παράλληλα» (όπως οι διεργασίες), αντί σε ανεξάρτητες διεργασίες, προκαλείται μικρότερη επιβάρυνση στο υπολογιστικό σύστημα, γιατί η μεταγωγή περιβάλλοντος μεταξύ νημάτων είναι πιο γρήγορη από ό,τι μεταξύ διεργασιών. Επιπλέον δεν είναι απαραίτητο πάντα να χρησιμοποιηθούν μηχανισμοί επικοινωνίας από τα νήματα, αφού έχουν για το σκοπό αυτό τη μνήμη που μοιράζονται, κάτι που θα γίνει κατανοητό παρακάτω.

Ένα παράδειγμα προγράμματος που μπορεί να χωριστεί σε νήματα, φαίνεται στο σχήμα. Το πρόγραμμα αυτό υπολογίζει για τις μεταβλητές x και y: - Με τη ρουτίνα Athroisma, το άθροισμά τους και το αποθηκεύει στη μεταβλητή sum. - Με τη ρουτίνα Diafora, τη διαφορά τους και την αποθηκεύει στη μεταβλητή diff. - Με τη ρουτίνα Phliko, το πηλίκο τους και το αποθηκεύει στη μεταβλητή quot.

Οι τρεις αυτοί υπολογισμοί προσδιορίζουν την τιμή διαφορετικών μεταβλητών και ο ένας δεν εξαρτάται από τον άλλο, έτσι μπορούν να γίνουν παράλληλα.

Αν επιλέξουμε να διαιρέσουμε το πρόγραμμα σε τρεις ταυτόχρονες διεργασίες, και οι τρεις χρειάζονται τις μεταβλητές x και y για να κάνουν τους υπολογισμούς τους. Έτσι η λύση αυτή έχει δυο μειονεκτήματα:

- Η μνήμη σπαταλάται, γιατί έχουμε τρία διαφορετικά αντίγραφα κάθε μεταβλητής στη μνήμη. Εδώ βέβαια πρόκειται για δυο μεταβλητές μόνο, αλλά αν επρόκειτο για πολλά δεδομένα, η σπατάλη θα ήταν πολύ ουσιαστική.

- Πρέπει να χρησιμοποιηθεί κάποιος μηχανισμός επικοινωνίας που θα εξασφαλίζει ότι οι μεταβλητές x και y των τριών διεργασιών περιέχουν τα ίδια δεδομένα. Αν π.χ. τα δεδομένα δίνονται από το χρήστη, πρέπει η μια από τις τρεις διεργασίες να τα διαβάσει και να τα στείλει στις άλλες δυο, ή μια άλλη διεργασία να τα ζητήσει από το χρήστη και να τα γράψει σε ένα αρχείο, από όπου θα τα διαβάσουν οι υπόλοιπες. Αυτές οι διαδικασίες και προγραμματιστικό κόπο απαιτούν, και επιβαρύνουν το χρόνο εκτέλεσης των διεργασιών, και απαιτούν επιπλέον πόρους του συστήματος (μηχανισμούς επικοινωνίας ή αρχεία).

Η εναλλακτική λύση που δεν έχει τα παραπάνω μειονεκτήματα είναι να χωρίσουμε το πρόγραμμα σε τρία νήματα. Τα νήματα αυτά θα μοιράζονται τη μνήμη που καταλαμβάνουν οι δυο μεταβλητές, και θα τη διαβάζουν για να κάνουν τους υπολογισμούς τους. Μόνο ένα αντίγραφο των μεταβλητών θα κρατείται στη μνήμη -έτσι δε γίνεται σπατάλη- και βέβαια δεν τίθεται ζήτημα επικοινωνίας για ανταλλαγή δεδομένων.

Τα προγράμματα που μπορούν να διαιρεθούν σε τμήματα, κάθε ένα από τα οποία ανατίθεται σε ένα νήμα, ονομάζονται ταυτόχρονα (concurrent programs). Ένα τέτοιο πρόγραμμα είναι το προηγούμενο, ή π.χ. το σύστημα κράτησης θέσεων μιας αεροπορικής εταιρίας, όπου κάθε πράκτορας αντιστοιχεί σε ένα νήμα.

Στα επόμενα μαθήματα, ο όρος «Διεργασία» θα χρησιμοποιείται τόσο για τις διεργασίες (που δε χρησιμοποιούν μνήμη από κοινού) όσο και για τα νήματα (τα οποία χρησιμοποιούν μνήμη από κοινού), εκτός και αν αναφέρεται διαφορετικά.