Διαχείριση διεργασιών

Download Report

Transcript Διαχείριση διεργασιών

Τι είναι διεργασία
Ένα πρόγραμμα σε εκτέλεση
Η διεργασία περιλαμβάνει:




Κώδικα προγράμματος (text)
Στοίβα (stack)
Τμήμα δεδομένων (data)
Σωρό (heap)
Κατάσταση διεργασίας
Καθώς εκτελείται, μια διεργασία
αλλάζει κατάσταση





Καινούργια (new): η διεργασία
δημιουργείται
Εκτελούμενη (running):
εκτελούνται εντολές
σε αναμονή (waiting): αναμένει
για κάποιο συμβάν
Έτοιμη (ready): περιμένει να
εκτελεστεί
Τερματισμένη (terminated): έχει
τελειώσει η εκτέλεσή της
Μπλοκ ελέγχου διεργασίας (PCB)
Πληροφορίες σχετικά με τη διεργασία
Κατάσταση διεργασίας
Μετρητής προγράμματος
Καταχωρητές ΚΜΕ
Πληροφορίες χρονοδρομολόγησης
Πληροφορίες διαχείρισης μνήμης
Λογιστικές πληροφορίες
Πληροφορίες κατάστασης Ε/Ε
Αλλαγή ΚΜΕ μεταξύ διεργασιών
Το PCB αποθηκεύεται όταν μια διεργασία απομακρύνεται από
την ΚΜΕ και μια άλλη παίρνει τη θέση της (context switch –
μεταγωγή περιβάλλοντος).
Μεταγωγή περιβάλλοντος
Όταν η ΚΜΕ αλλάζει σε άλλη διεργασία,
συμβαίνει μια διακοπή (interrupt) και τρέχει
ρουτίνα του πυρήνα για να αποθηκεύσει το
περιβάλλον της τρέχουσας διεργασίας
Το σύστημα σώζει την κατάσταση της παλιάς
διεργασίας και φορτώνει την κατάσταση της
νέας.
Ο χρόνος για τη μεταγωγή περιβάλλοντος είναι
επιβάρυνση – δε γίνεται χρήσιμη δουλειά.
Ο χρόνος εξαρτάται από την υποστήριξη του
υλικού (1 έως 1000 μικροδευτερόλεπτα)
Δημιουργία διεργασίας
Οι γονικές διεργασίες δημιουργούν θυγατρικές διεργασίες
κ.ο.κ. (fork) (δέντρο διεργασιών)
Κάθε διεργασία έχει δικό της αναγνωριστικό (PID)
Γονική και θυγατρική διεργασία μπορεί να μοιράζονται
τους πόρους ή όχι (ή εν μέρει)
Εκτελούνται παράλληλα ή οι γονικές περιμένουν κάποιες
ή όλες τις θυγατρικές να τερματίσουν
Η θυγατρική παίρνει αντίγραφο του χώρου διευθύνσεων
της γονικής στον οποίο φορτώνει στη συνέχεια ένα νέο
πρόγραμμα για εκτέλεση
Δέντρο διεργασιών σε ένα
σύστημα UNIX
Τερματισμός διεργασίας
Η διεργασία εκτελεί την τελευταία εντολή και μετά
ζητά από το Λ.Σ. να την διαγράψει (exit)
Η γονική μπορεί να τερματίσει θυγατρική διεργασία
(abort) για διάφορους λόγους (π.χ., υπέρβαση πόρων,
τερματισμός γονικής, το έργο που επιτελεί δεν
απαιτείται πλέον)
Συνεργαζόμενες διεργασίες
Η ανεξάρτητη διεργασία δε μπορεί να
επηρεάσει/επηρεαστεί από την εκτέλεση άλλης
Η συνεργαζόμενη διεργασία μπορεί να
επηρεάσει/επηρεαστεί από την εκτέλεση άλλης
Πλεονεκτήματα συνεργατικότητας




Διαμοίραση πληροφοριών
Επιτάχυνση υπολογισμών με παράλληλες υποεργασίες
Σπονδυλωτή διάρθρωση λειτουργιών συστήματος
Άνεση – θέλει κανείς να μπορεί να τυπώνει, να συντάσσει
και να μεταγλωττίζει παράλληλα
Συνεργαζόμενες διεργασίες
Απαιτούν ένα μηχανισμό διαδιεργασιακής επικοινωνίας (IPC) για
την ανταλλαγή δεδομένων όπως:


Πέρασμα μηνυμάτων (message passing)
 Χρήσιμο για λίγα δεδομένα
 Ευκολότερο στην υλοποίηση
 Απαιτεί κλήσεις συστήματος και συνεπώς παρέμβαση του πυρήνα
Διαμοιραζόμενη μνήμη (shared memory)
 Μέγιστη ταχύτητα (μνήμη) και άνεση
 Κλήσεις συστήματος μόνο για να οριστούν οι κοινές περιοχές
μνήμης (μετέπειτα επικοινωνία δεν απαιτεί τον πυρήνα)
Συγχρονισμός διεργασιών
Ταυτόχρονη πρόσβαση σε διαμοιραζόμενα
δεδομένα μπορεί να προκαλέσει ασυνέπεια
δεδομένων
Απαιτείται μηχανισμός διατήρησης συνέπειας
δεδομένων
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Διαμοιραζόμενα δεδομένα:
#define BUFFER_SIZE 10
typedef struct {
...
} item;
item buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
int counter = 0;
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Διεργασία παραγωγός
item nextProduced;
while (1) {
while (counter == BUFFER_SIZE)
; /* do nothing */
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Διεργασία καταναλωτής
item nextConsumed;
while (1) {
while (counter == 0)
; /* do nothing */
nextConsumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
counter--;
}
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Οι εντολές
counter++;
counter--;
πρέπει να εκτελούνται ατομικά
Ατομική λειτουργία σημαίνει ότι
ολοκληρώνεται χωρίς διακοπή
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Η εντολή “counter++” υλοποιείται σε κώδικα
μηχανής ως:
register1 = counter
register1 = register1 + 1
counter = register1
Η εντολή “counter--” υλοποιείται ως:
register2 = counter
register2 = register2 – 1
counter = register2
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Αν και ο παραγωγός και ο καταναλωτής
προσπαθούν να ενημερώσουν τον buffer
ταυτόχρονα, οι εντολές μηχανής των δύο
μπορεί να διαπλεχθούν.
Η διαπλοκή εξαρτάται από το πώς
δρομολογούνται ο παραγωγός και ο
καταναλωτής.
Πεπερασμένος χώρος
προσωρινής αποθήκευσης
Έστω ο counter είναι αρχικά 5. Μια ανάμειξη των
εντολών είναι:
παραγωγός: register1 = counter (register1 = 5)
παραγωγός : register1 = register1 + 1 (register1 = 6)
καταναλωτής: register2 = counter (register2 = 5)
καταναλωτής : register2 = register2 – 1 (register2 = 4)
παραγωγός : counter = register1 (counter = 6)
καταναλωτής : counter = register2 (counter = 4)
Η τιμή του counter μπορεί να είναι είτε 4 είτε 6, ενώ το
σωστό αποτέλεσμα θα ήταν 5.
Αρχικές προσπάθειες επίλυσης
Μόνο 2 διεργασίες, P0 και P1
Γενική δομή διεργασίας Pi (άλλη διεργασία Pj)
do {
entry section
critical section
exit section
remainder section
} while (1);
Οι διεργασίες μπορεί να μοιράζονται κοινές μεταβλητές
για να συγχρονίσουν τις ενέργειές τους
Συνθήκες συναγωνισμού
Συνθήκη συναγωνισμού (race condition):
κατάσταση όπου διάφορες διεργασίες
προσπελαύνουν και χειρίζονται
διαμοιραζόμενα δεδομένα ταυτόχρονα
Η τελική τιμή των δεδομένων εξαρτάται από
το ποια διεργασία τελειώνει τελευταία
Απαιτείται συγχρονισμός για την αποφυγή
συνθηκών συναγωνισμού
Κρίσιμα τμήματα
Μερικές διεργασίες συναγωνίζονται για τη
χρήση διαμοιραζόμενων δεδομένων
Κάθε διεργασία έχει ένα τμήμα κώδικα, το
κρίσιμο τμήμα (critical section), στο οποίο
προσπελαύνονται τα διαμοιραζόμενα
δεδομένα
Πρόβλημα: εξασφάλισε ότι όταν μια
διεργασία εκτελείται στο κρίσιμο τμήμα της,
καμιά άλλη δεν επιτρέπεται να εκτελέσει το
δικό της
Λύσεις στο πρόβλημα του
κρίσιμου τμήματος
Αμοιβαίος αποκλεισμός: Αν μια διεργασία
εκτελείται στο κρίσιμο τμήμα της, τότε δεν
επιτρέπεται άλλες να εκτελούνται στο δικό τους
Πρόοδος: Αν καμία δεν εκτελείται στο κρίσιμο
τμήμα της αλλά κάποιες επιθυμούν να μπουν στο
δικό τους, τότε πρέπει η επιλογή αυτών που θα μπουν
να μην αναβάλλεται επ’ αόριστον
Πεπερασμένη αναμονή: Πρέπει να υπάρχει ένα
όριο στο πόσες φορές επιτρέπεται να μπουν άλλες
διεργασίες στο κρίσιμο τμήμα τους ανάμεσα στη
στιγμή που μια διεργασία έκανε ένα σχετικό αίτημα
μέχρι τη στιγμή που ικανοποιήθηκε.
Αλγόριθμοι επίλυσης
Λύσεις λογισμικού:



Λύση του Peterson
Σημαφόροι
Παρακολουθητές
Λύσεις υλικού:


Εντολή TestAndSet
Εντολή Swap
Λύσεις υλικού
Απενεργοποίηση διακοπών (interrupts).
Έλεγξε και τροποποίησε το περιεχόμενο
μιας λέξης ατομικά.
boolean TestAndSet(boolean *target)
{
boolean rv = *target;
*target = true;
return rv;
}
Αμοιβαίος αποκλεισμός με
TestΑndSet
Διαμοιραζόμενα δεδομένα:
boolean lock = false;
Διεργασία Pi
do {
while (TestAndSet(&lock)) ;
critical section
lock = false;
remainder section
}
Λύσεις υλικού
Αντάλλαξε ατομικά δύο μεταβλητές:
void Swap(boolean *a, boolean *b) {
boolean temp = *a;
*a = *b;
*b = temp;
}
Αμοιβαίος αποκλεισμός με Swap
Διαμοιραζόμενα δεδομένα:
boolean lock = false;
Διεργασία Pi
do {
key = true;
while (key == true)
Swap(&lock,&key);
critical section
lock = false;
remainder section
}
Σημαφόροι
Εργαλείο συγχρονισμού που δεν απαιτεί αναμονή με
απασχόληση
Σημαφόρος S – ακέραια μεταβλητή
Μπορεί να προσπελαστεί μόνο μέσω δύο αδιαίρετων
(ατομικών) λειτουργιών
wait (S):
while S 0 do no-op;
S--;
signal (S):
S++;
Σημαφόροι
Σημαφόρος μετρητής: παίρνει ακέραιες τιμές
από ένα απεριόριστο πεδίο (για πολλά
στιγμιότυπα ενός πόρου)
Δυαδικός σημαφόρος: παίρνει μόνο τιμές 0
και 1 (mutex locks)
Κρίσιμο τμήμα n διεργασιών
Διαμοιραζόμενα δεδομένα:
semaphore mutex; //αρχικά mutex = 1
Διεργασία Pi:
do {
wait(mutex);
critical section
signal(mutex);
remainder section
} while (1);
Παρακολουθητές
Δομή συγχρονισμού υψηλού επιπέδου που επιτρέπει ασφαλή
διαμοίραση ενός αφηρημένου τύπου δεδομένων μεταξύ ταυτόχρονων
διεργασιών:
monitor monitor-name
{
shared variable declarations
procedure body P1 (…) {
...
}
procedure body P2 (…) {
...
}
procedure body Pn (…) {
...
}
{
initialization code
}
}