Next                 Up                   Back                     Contents

Επόμενο:Β.6 ΒΗΜΑΤΙΚΗ ΕΚΤΕΛΕΣΗ Πάνω: Παράρτημα Β Πίσω: Β.4 ΣΗΜΕΙΑ ΠΑΥΣΗΣ


 

Β.5 ΔΙΕΡΓΑΣΙΕΣ ΚΑΙ ΕΠΕΞΕΡΓΑΣΤΕΣ

 

Καθώς ένα πρόγραμμα Multi-Pascal δημιουργεί νέες διεργασίες μέσω των δομών FORALL και FORK ο διερμηνέας εκχωρεί ένα μοναδικό αριθμό αναγνώρισης σε κάθε διεργασία. Το κυρίως πρόγραμμα έχει πάντα τον αριθμό 0 και οι υπόλοιπες διαδικασίες αριθμούνται ακολουθιακά ξεκινώντας από το 1. Οι αριθμοί διεργασιών δεν ξαναχρησιμοποιούνται στην ίδια εκτέλεση προγράμματος ακόμη και αν κάποιες διεργασίες τερματιστούν.

Καθώς μιά διεργασία δημιουργείται, αυτή αυτόματα ανατίθεται σε έναν επεξεργαστή. Είναι σημαντικό να γίνει κατανοητή η διαφορά μεταξύ διεργασίας και επεξεργαστή. Μιά διεργασία είναι ένα αντίγραφο μιάς ακολουθίας εντολών Multi-Pascal που πρέπει πάντα να εκτελείται σε έναν επεξεργαστή.

Ο συνολικός αριθμός επεξεργαστών είναι δεδομένος από το συγκεκριμένο υπολογιστικό σύστημα. Από την άλλη πλευρά οι διεργασίες δημιουργούνται και τερματίζονται ελεύθερα από την γλώσσα προγραμματισμού. Το κεφάλαιο 8 συζητά την ελεγχόμενη ανάθεση διεργασίας σε επεξεργαστή στα πλαίσια της Multi-Pascal. Στις περισσότερες όμως περιπτώσεις η αυτόματη ανάθεση διεργασίας σε επεξεργαστή από την Multi-Pascal είναι επαρκής.

Οι επεξεργαστές στο περιβάλλον της Multi-Pascal αριθμούνται από 0 έως ένα μέγιστο που εξερτάται από την εγκατάσταση (255 ή 511 συνήθως). Το κυρίως πρόγραμμα ανατίθεται προς εκτέλεση στον επεξεργαστή 0. Μόλις δημιουργείται μιά νέα διεργασία αυτή ανατίθεται στον πρώτο ελεύθερο επεξεργαστή ξεκινώντας από τον επεξεργαστή με αριθμό 1. Όταν ένας επεξεργαστής μένει ανενεργός επειδή η διεργασία που του έχει ανατεθεί έχει τερματιστεί τότε αυτός γίνεται πάλι υποψήφιος γιά την εκχώρηση νέας διεργασίας.

Στα περισσότερα παραδείγματα του κειμένου ο συνολικός αριθμός διεργασιών δεν ξεπερνά τον μέγιστο αριθμό επεξεργαστών. Όμως η Multi-Pascal επιτρέπει την ανάθεση περισσότερων διεργασιών σε έναν επεξεργαστή. Όταν όλοι οι διαθέσιμοι επεξεργαστές έχουν καταληφθεί τότε οι νέες αδιάθετες διεργασίες διανέμονται ομοιόμορφα στους επεξεργαστές. Καθώς δημιουργείται μιά νέα διεργασία αυτή ανατίθεται στον επεξεργαστή με τον μικρότερο αριθμό διεργασιών. Όμως από τη στιγμή που μιά διεργασία εκχωρηθεί σε έναν επεξεργαστή εκτελείται εκεί μέχρι τον τελικό τερματισμό της, δηλαδή δεν προβλέπεται μετανάστευση διεργασιών κατά την εκτέλεσή τους.

Κάθε φορά που η εκτέλεση ενός προγράμματος Multi-Pascal αναστέλλεται λόγω ενός σημείου παύσης ο χρήστης μπορεί να ελέγξει την κατάσταση όλων των διεργασιών. Όταν εκτελείται ένα ακολουθιακό πρόγραμμα υπάρχει ένα μόνο "σημείο εκτέλεσης" που κινείται από μία εντολή στην επόμενη και γενικά μπορεί να βρίσκεται οπουδήποτε στο κυρίως πρόγραμμα ή σε μιά διαδικασία. Όμως σε ένα παράλληλο πρόγραμμα κάθε διεργασία έχει το δικό του σημείο εκτέλεσης που κινείται από μία εντολή σε άλλη παράλληλα με τα σημεία εκτέλεσης των άλλων διεργασιών. Γιά παράδειγμα θεωρείστε το πρόγραμμα του Σχήματος 2.3. Κάθε επεξεργαστής εκτελεί, ως διεργασία που του έχει ανατεθεί, το δικό του αντίγραφο της διαδικασίας PutinPlace. Έτσι κάθε διεργασία έχει το δικό της σημείο εκτέλεσης μέσα στο δικό της αντίγραφο της διαδικασίας, το οποίο σημείο μπορεί να διαφέρει από διεργασία σε διεργασία.

Γιά να ελέγξουμε την κατάσταση των διεργασιών ενός προγράμματος που έχει ανασταλεί η λειτουργία του σε σημείο παύσης εισάγουμε την εντολή

 

*STATUS

 

Το περιβάλλον της Multi-Pascal θα εμφανίσει έναν πίνακα διεργασιών. Έτσι γιά το πρόγραμμα του Σχήματος. 2.3, ο παρακάτω πίνακας δίνει ένα τμήμα οθόνης γιά ένα τυπικό παράδειγμα κατάστασης

 


PROCESS #	PROCEDURE	LINE NUMBER	STATUS   PROCESSOR
    0		 RANKSORT		20	BLOCKED	 0
    1		PUTINPLACE		12	RUNNING	 1
    2		PUTINPLACE		13	RUNNING	 2
    3		PUTINPLACE		12	RUNNING	 3
    4		PUTINPLACE		14  	RUNNING  4
    5		PUTINPLACE		13	RUNNING	 5

 

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

 

*STATUS <αριθμός διεργασίας>:<αριθμός διεργασίας>

 

Επομένως η ακριβής εντολή γιά το προηγούμενο παράδειγμα θα ήταν

 

*STATUS 0:5

 

Κάτω από την επικεφαλίδα PROCESS # φαίνονται οι αριθμοί αναγνώρισης των διεργασιών. Η διεργασία 0 είναι το κυρίως πρόγραμμα, δηλαδή η πατρική διεργασία γιά όλες τις υπόλοιπες. Κάτω από την επικεφαλίδα PROCEDURE εμφανίζεται το όνομα της διαδικασίας που αντιστοιχεί στην διαργασία. Στην περίπτωση του κυρίως προγράμματος πρόκειται γιά το όνομα του προγράμματος, εδώ RANKSORT. Όλες οι υπόλοιπες διεργασίες είναι αντίγραφα της αυτής διαδικασίας, της PUTINPLACE. Η διεργασία 0 έχει ανατεθεί στον επεξεργαστή 0 όπως φαίνεται από την στήλη PROCESSOR, ενώ οι διεργασίες-παιδιά έχουν εκχωρηθεί στους υπόλοιπους επεξεργαστές. Κάτω από την επικεφαλίδα STATUS φαίνεται η τρέχουσα κατάσταση της κάθε διεργασίας. Η εκτέλεση της διεργασίας 0 έχει ανασταλεί (BLOCKED) σε αναμονή του τερματισμού των υπολοίπων διεργασιών οι οποίες εκτελούνται (RUNNING). Η στήλη LINE NUMBER δίνει την γραμμή προγράμματος στην οποία βρίσκεται το σημείο εκτέλεσης κάθε διεργασίας την στιγμή της παύσης.

Υπάρχουν συνολικά πέντε πιθανές καταστάσεις στις οποίες μπορεί να βρεθεί μιά διεργασία:

 

READY - Έτοιμη προς εκτέλεση

RUNNING - Εκτελούμενη

BLOCKED - Σταματημένη, σε αναμονή

DELAYED - Καθυστερούμενη

SPINNING - Σε διαδικασία κλειδώματος

 

Μιά διεργασία είναι έτοιμη προς εκτέλεση (READY) όταν είναι διαθέσιμη προς εκτέλεση, δηλαδή δεν υπάρχει εξωτερικό αίτιο που της απαγορεύει να εκτελεστεί, αλλά δεν εκτελείται (RUNNING) από κάποιον επεξεργαστή γιατί αυτός εκτελεί κάποια άλλη διεργασία προς το παρόν. Ο κάθε επεξεργαστής μπορεί να εκτελεί μόνο μία διεργασία κάθε χρονική στιγμή. Μιά διεργασία μόλις δημιουργηθεί τίθεται σε στη κατάσταση READY.

Μιά διεργασία είναι σε κατάσταση αναμονής (BLOCKED) όταν περιμένει κάτι από κάποια άλλη διεργασία γιά να συνεχίσει. Αυτό συνήθως συμβαίνει σε δύο περιπτώσεις. Πρώτον, μπορεί μία διεργασία να αναμένει να διαβάσει κάποια δεδομένα από μιά μεταβλητή καναλιού (δες κεφάλαιο 4). Δεύτερον, μπορεί να πρόκειται για κάποια πατρική διεργασία που αναμένει τον τερματισμό μιάς ή περισσοτέρων διεργασιών-παιδιών οι οποίες έχουν δημιουργηθεί με δομή FORALL ή FORK. Τέτοια είναι η περίπτωση του παραδείγματος του Σχήματος 2.3.

Μιά καθυστερούμενη (DELAYED) διεργασία συμπεριφέρεται περίπου ως σταματημένη (BLOCKED) διεργασία με τη διαφορά οτι το γεγονός που η διεργασία αναμένει έχει μεν συμβεί αλλά δεν έχει φθάσει σε αυτήν λόγω καθυστέρησης στις επικοινωνίες μέσω καναλιών. Καθυστερούμενες διεργασίες συναντώνται συνήθως σε αρχιτεκτονικές κατανεμημένης μνήμης που επικοιωνούν με πέρασμα μηνυμάτων μέσω καναλιών. Επειδή η Multi-Pascal είναι προσομοιωτής γνωρίζει οτι το μήνυμα έχει αποσταλεί από την μία διεργασία αλλά δεν έχει φθάσει ακόμη στον παραλήπτη.

Μιά διεργασία που βρίσκεται σε διαδικασία κλειδώματος (SPINNING) συμπεριφέρεται και αυτή ως σταματημένη (BLOCKED) με την έννοια οτι η διεργασία αυτή προσπαθεί να πραγματοποιήσει ένα κλείδωμα (δες κεφάλαιο 5). Είναι επομένως σε κατάσταση ενεργής αναμονής (busy waiting) μέχρι να περατωθεί το κλείδωμα του πόρου. Διεργασίες σε τέτοια κατάσταση μπορούν να βρεθούν συνήθως σε αρχιτεκτονικές διαμοιραζόμενης μνήμης.

Ένας επεξεργαστής μπορεί να διαθέτει σε δεδομένη χρονική στιγμή αρκετές διεργασίες σε ετοιμότητα (READY) και σε γενική αναμονή (BLOCKED, DELAYED ή SPINNING). Αλλά στην ίδια χρονική στιγμή μόνο μιά διεργασία μπορεί να εκτελείται (RUNNING) σε έναν επεξεργαστή. Αν υπάρχουν πολλές διεργασίες σε ετοιμότητα τότε ο επεξεργαστής εργάζεται με το σύστημα του χρονομερισμού εναλλάσσοντας διεργασίες προς εκτέλεση. Αν πάλι υπάρχει μόνο μιά διεργασία προς εκτέλεση τότε αυτή παραμένει εκτελούμενη μέχρι να τεθεί σε καποια κατάσταση αναμονής ή να τερματιστεί. Οι διεργασίες που τερματίζονται δεν εμφανίζονται στον πίνακα της κατάστασης.


     Next              Up                 Back                  Contents

Επόμενο:Β.6 ΒΗΜΑΤΙΚΗ ΕΚΤΕΛΕΣΗ Πάνω: Παράρτημα Β Πίσω: Β.4 ΣΗΜΕΙΑ ΠΑΥΣΗΣ