Professional Documents
Culture Documents
1- παραλληλος προγραμματισμός PDF
1- παραλληλος προγραμματισμός PDF
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 1 lalis@inf.uth.gr
Μονονηματική / πολυνηματική εκτέλεση
• Μονονηματικό μοντέλο εκτέλεσης (συμβατικό)
• οι εντολές του κώδικα εκτελούνται ακολουθιακά
• μέσα από ένα μοναδικό νήμα εκτέλεσης (execution thread)
• συχνά χρησιμοποιείται και ο όρος διεργασία (process)
main νήμα P1 P2 P3
(διαδρομή
... εκτέλεσης) ... ... ...
... ... ... ...
PC ... ... PC ... ...
... PC ... ... ...
... ... ... PC ...
... ... ... ...
πρόγραμμα πρόγραμμα
αλληλεπίδραση
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 3 lalis@inf.uth.gr
Ταυτόχρονος & παράλληλος προγραμματισμός
• Ταυτόχρονος προγραμματισμός
• προβλήματα συστημάτων που αποτελούνται
από συνεργαζόμενες διεργασίες
• αν δεν επιθυμούμε να υπάρχει αλληλεπίδραση
μεταξύ των διεργασιών τότε δεν τίθεται θέμα
ταυτόχρονου προγραμματισμού
• Παράλληλος προγραμματισμός
• επιτάχυνση ενός υπολογισμού
• υποδιαιρώντας τον σε περισσότερες διεργασίες
για παράλληλη εκτέλεση (σε ξεχωριστές CPUs)
• βασικός στόχος: η ελαχιστοποίηση της αλληλεπίδρασης
(επικοινωνίας, συγχρονισμού) μεταξύ των διεργασιών
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 4 lalis@inf.uth.gr
Γιατί πολλές διεργασίες;
• Υποστήριξη μη ακολουθιακού κώδικα
• μια διαδικασία μπορεί από τη φύση της να αποτελείται από
ανεξάρτητες υπο-διαδικασίες που μπορεί να εκτελεσθούν
ανεξάρτητα / παράλληλα μεταξύ τους
• Αποφυγή μπλοκαρίσματος
• ένα πρόγραμμα που πρέπει να εκτελεί (συνεχώς) μια
διαδικασία ενώ ταυτόχρονα πρέπει να περιμένει για κάποιο
«εξωτερικό» γεγονός, π.χ. δεδομένα από το δίκτυο / χρήστη
• Καλύτερη δόμηση προγράμματος
• μια πολύπλοκη διαδικασία μπορεί πιθανώς να εκφραστεί πιο
απλά αν δομηθεί ως συνδυασμός πολλών απλούστερων
διαδικασιών που εκτελούνται από διαφορετικές διεργασίες
• Υποστήριξη πολυπρογραμματισμού
• πολλοί χρήστες μοιράζονται ένα μηχάνημα
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 5 lalis@inf.uth.gr
Παράδειγμα – καλύτερη δόμηση
• Επιθυμούμε να φτιάξουμε ένα πρόγραμμα που
(α) δέχεται από την είσοδο του μια σειρά από λέξεις
(β) εκτυπώνει το κείμενο σε γραμμές των 80 χαρακτήρων
(γ) χωρίς να κόβονται οι λέξεις, και
(δ) κατανέμοντας τα κενά ανάμεσα τους
έτσι ώστε οι γραμμές να είναι στοιχισμένες
Προσέγγιση:
• Σπάμε την πολύπλοκη επεξεργασία σε διακριτά
στάδια οργανωμένα σε μια ροή εκτέλεσης όπου
κάθε στάδιο εκτελείται από μια ξεχωριστή διεργασία
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 6 lalis@inf.uth.gr
input
add
lines remove words assign lines
read spaces
spaces words to
chars between
and /n next line
words
output
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 7 lalis@inf.uth.gr
Παράδειγμα – λογικός παραλληλισμός
• Επιθυμούμε να φτιάξουμε ένα πρόγραμμα που
(α) δέχεται από την είσοδο του μια σειρά από ακέραιες τιμές
(β) τις ταξινομεί με αλφαβητική σειρά
(γ) τις εκτυπώνει στην έξοδο του
Προσέγγιση:
• Η ταξινόμηση μπορεί να γίνει ταυτόχρονα,
χρησιμοποιώντας δύο πίνακες και δύο διεργασίες
οπότε το τελικό αποτέλεσμα προκύπτει με την
συγχώνευση των επιμέρους αποτελεσμάτων
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 8 lalis@inf.uth.gr
input
data data
(unsorted) split (unsorted)
sort sort
data merge data
(sorted) (sorted)
output
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 9 lalis@inf.uth.gr
Παράδειγμα – αποφυγή μπλοκαρίσματος
• Επιθυμούμε να φτιάξουμε ένα πρόγραμμα το οποίο
(α) εκτελεί μια ή περισσότερες χρονοβόρες επεξεργασίες
(β) επιτρέπει ανά πάσα στιγμή στο χρήστη
να ελέγξει την κατάσταση των επεξεργασιών
Προσέγγιση:
• Κάθε επεξεργασία εκτελείται μέσα από μια
ξεχωριστή διεργασία που δημιουργείται
δυναμικά για αυτό το σκοπό
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 10 lalis@inf.uth.gr
worker
result
job
input
job
master worker
result
output
job
result worker
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 11 lalis@inf.uth.gr
Μοντέλο μνήμης & εκτέλεσης
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 12 lalis@inf.uth.gr
Διεργασίες και μνήμη
• Κάθε διεργασία είναι μια ξεχωριστή «οντότητα»
που εκτελεί κώδικα
• ανεξάρτητα από τις άλλες διεργασίες
• κάθε διεργασία μπορεί να εκτελεί διαφορετικό ή τον ίδιο
κώδικα – οι εκτελέσεις παραμένουν ανεξάρτητες!
• Κάθε διεργασία έχει «δική της» κατάσταση εκτέλεσης
• στατική μνήμη (globals)
• δυναμική μνήμη (heap)
• μετρητής εντολών (program counter)
• επιπλέον καταχωρητές CPU (registers)
• στοίβα (stack)
• Δύο πολύ βασικές περιπτώσεις:
διεργασίες με ή χωρίς κοινή μνήμη (globals/heap)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 13 lalis@inf.uth.gr
Διεργασίες με κοινή μνήμη
καθολική μνήμη
...
...
στοίβα στοίβα στοίβα
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 14 lalis@inf.uth.gr
Διεργασίες χωρίς κοινή μνήμη
...
...
στοίβα στοίβα στοίβα
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 15 lalis@inf.uth.gr
Αμοιβαίος αποκλεισμός & επικοινωνία
• Αμοιβαίος αποκλεισμός: συντονισμένη
πρόσβαση σε κοινά δεδομένα ή κοινούς πόρους
• βασικό πρόβλημα για διεργασίες με κοινή μνήμη/πόρους
(κανένα πρόβλημα για διεργασίες χωρίς κοινή μνήμη/πόρους)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 16 lalis@inf.uth.gr
Ταυτόχρονη εκτέλεση (γενική περίπτωση)
• Δύο βασικές περιπτώσεις
• εναλλαγή διεργασιών πάνω σε μια CPU
• παράλληλη εκτέλεση διεργασιών σε διαφορετικές CPU
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 17 lalis@inf.uth.gr
P1 P2 P3 P1 P2 P3 P1 P2 P3
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 18 lalis@inf.uth.gr
Εναλλαγή διεργασιών σε μια CPU
• Συχνά πρέπει να υποστηριχθεί η εκτέλεση
Ν διεργασιών πάνω από Μ CPUs, με Μ<Ν
• κλασικό παράδειγμα: Η/Υ με 1 CPU
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 19 lalis@inf.uth.gr
χρόνος
συνεχόμενη
εκτέλεση καθυστέρηση
λόγω διακοπών
χρόνος που μπορεί να
χρησιμοποιηθεί για την εκτέλεση
άλλων διεργασιών
διακοπτόμενη
εκτέλεση
pause continue
pause continue
pause continue
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 20 lalis@inf.uth.gr
χρόνος
P1
(α)
P2
(β) P1 & P2
(γ) P1 & P2
(δ) P1 & P2
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 21 lalis@inf.uth.gr
Κύριες «διαστάσεις»
Διάσταση Επιλογές
Καθολική μνήμη - κοινή (shared memory)
(static memory & heap) - ξεχωριστή (private memory)
Εναλλαγή διεργασίας - ρητή (non-preemptive, manual switch)
- αυτόματη (preemptive, automatic switch)
Επιλογή της επόμενης - ρητή (manual process selection)
διεργασίας προς εκτέλεση - αυτόματη (automatic process selection)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 22 lalis@inf.uth.gr
Διαχείριση διεργασιών
(από το σύστημα)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 23 lalis@inf.uth.gr
Λειτουργία εναλλαγής
• Για κάθε διεργασία, το σύστημα κρατά σε κατάλληλη
δομή την κατάσταση της αντίστοιχης εκτέλεσης
• στατική & δυναμική μνήμη (όχι απαραίτητα)
• μνήμη για την αντιγραφή των καταχωρητών CPU
• στοίβα
• Κύρια βήματα εναλλαγής
• διακοπή εκτέλεσης
• σώσιμο κατάστασης της διεργασίας
• επιλογή της επόμενης διεργασίας προς εκτέλεση
• επαναφορά κατάστασης της επιλεγμένης διεργασίας
• συνέχεια εκτέλεσης
• Πολλές σημαντικές «λεπτομέρειες» …
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 24 lalis@inf.uth.gr
task descriptor
stack
stack_beg
stack_end
mem_start
mem_end
cpu_reg0
memory
cpu_reg1
cpu_reg2
…
cpu_regN
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 25 lalis@inf.uth.gr
P1 εκτελείται
current
task
CPU
regs
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 26 lalis@inf.uth.gr
σώσιμο κατάστασης P1
current
task
CPU
save
regs
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 27 lalis@inf.uth.gr
επιλογή διεργασίας P2
current
task
CPU
regs
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 28 lalis@inf.uth.gr
επαναφορά κατάστασης P2
current
task
CPU restore
regs
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 29 lalis@inf.uth.gr
P2 εκτελείται
current
task
CPU
regs
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 30 lalis@inf.uth.gr
Κόστος εναλλαγής
• O χρόνος που ξοδεύεται για την εναλλαγή διεργασιών
αποτελεί γραφειοκρατικό κόστος (overhead)
• κατά την διάρκεια της εναλλαγής δεν εκτελείται
κώδικας των προγραμμάτων των χρηστών
• Ο χρόνος της εναλλαγής εξαρτάται κυρίως από
• την πολυπλοκότητα υλοποίησης του συστήματος
• την υποστήριξη που παρέχει το υλικό (ειδικές εντολές)
• Όσο περισσότερες εναλλαγές γίνονται ανά μονάδα
χρόνου τόσο λιγότερος χρόνος αφιερώνεται στην
εκτέλεση των διεργασιών του συστήματος
• χειρότερη περίπτωση: γίνονται μόνο εναλλαγές
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 31 lalis@inf.uth.gr
χρόνος
(α)
(β)
(γ)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 32 lalis@inf.uth.gr
Κατάσταση διεργασίας
• Πολλές διεργασίες απλά … περιμένουν (κάτι)
• να περάσει ένα συγκεκριμένο χρονικό διάστημα
• να παραλάβουν δεδομένα από άλλες διεργασίες
• να γίνει αληθής μια συγκεκριμένη συνθήκη
• Ιδανικά, το σύστημα πρέπει να γνωρίζει
κατά πόσο μια διεργασία βρίσκεται εν αναμονή
• ώστε να μην της δίνει χρόνο από τον επεξεργαστή
• Για αυτό το σκοπό, το σύστημα υποστηρίζει
ξεχωριστές «καταστάσεις» για μια διεργασία
• και παρέχει ειδικές λειτουργίες για την ρητή (υπό
τον έλεγχο του προγραμματιστή) ή την αυτόματη
μετάβαση ανάμεσα σε αυτές τις καταστάσεις
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 33 lalis@inf.uth.gr
πότε θα έρθει ο
επόμενος χαρακτήρας
από το πληκτρολόγιο;
P1
πότε θα έρθουν τα
δεδομένα που είπε ότι
θα μου στείλει η P1;
P2
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 34 lalis@inf.uth.gr
Ενδεικτικές λειτουργίες
• start(Task *t)
• δημιουργία νέας διεργασίας
• stop()
• τερματισμός (τρέχουσας) διεργασίας
• yield()
• ρητή εναλλαγή – παραχώρηση του επεξεργαστή
• suspend()
• απενεργοποίηση (τρέχουσας) διεργασίας, με εναλλαγή
• resume(Task *t)
• αφύπνιση της διεργασίας στην οποία γίνεται αναφορά
• αν η διεργασία δεν βρίσκεται σε κατάσταση αναμονής,
η κλήση δεν έχει απολύτως κανένα αποτέλεσμα
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 35 lalis@inf.uth.gr
dead
stοp()
running
suspend() context-switch
yield()
(into task)
or
context-switch
(out of task)
blocked ready
resume(task)
start(task)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 36 lalis@inf.uth.gr
cur
P0 P1 P2
tasks ready running ready
P1 εκτελείται
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 37 lalis@inf.uth.gr
cur
P0 P1 P2
tasks ready ready running
P1 καλεί yield()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 38 lalis@inf.uth.gr
cur
P0 P1 P2
tasks running ready ready
P2 καλεί yield()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 39 lalis@inf.uth.gr
cur
P0 P1 P2
tasks ready running ready
P0 καλεί yield()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 40 lalis@inf.uth.gr
cur
P0 P1 P2
tasks ready blocked running
P1 καλεί suspend()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 41 lalis@inf.uth.gr
cur
P0 P1 P2
tasks running blocked blocked
P2 καλεί suspend()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 42 lalis@inf.uth.gr
cur
P0 P1 P2
tasks running blocked blocked
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 43 lalis@inf.uth.gr
cur
P0 P1 P2
tasks ready blocked running
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 44 lalis@inf.uth.gr
cur
P0 P1 P2
tasks running blocked ready
P2 καλεί yield()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 45 lalis@inf.uth.gr
cur
P0 P1 P2
tasks running blocked ready
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 46 lalis@inf.uth.gr
Βελτιστοποίηση
• Αν υπάρχουν πολλές διεργασίες σε αναμονή
• δεν συμφέρει να τις κρατάμε στην ίδια λίστα
με τις διεργασίες που είναι έτοιμες προς εκτέλεση
• στην χειρότερη περίπτωση, κάθε φορά που επιχειρείται
εναλλαγή θα πραγματοποιούνται Ο(Ν) έλεγχοι για να
βρεθεί η επόμενη έτοιμη διεργασία
• Μπορούμε να εισάγουμε μια ξεχωριστή λίστα,
αποκλειστικά για τις διεργασίες εν αναμονή
• οι λειτουργίες suspend και resume γίνονται πιο πολύπλοκες
καθώς πρέπει να «μετακινούν» μια διεργασία από την μια
λίστα στην άλλη – αλλά αυτό γίνεται σε Ο(1)
• και η εναλλαγή γίνεται πλέον σε Ο(1)
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 47 lalis@inf.uth.gr
P0 P1 P2
tasks ready running ready
blocked
P1 εκτελείται
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 48 lalis@inf.uth.gr
P0 P2
tasks ready ready
P1
blocked blocked
P1 καλεί suspend()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 49 lalis@inf.uth.gr
P0 P2
tasks ready ready
P1
blocked blocked
P2 εκτελείται
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 50 lalis@inf.uth.gr
P0
tasks running
P1 P2
blocked blocked blocked
P2 καλεί suspend()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 51 lalis@inf.uth.gr
P0
tasks running
P1 P2
blocked blocked blocked
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 52 lalis@inf.uth.gr
P0 P1
tasks ready running
P2
blocked blocked
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 53 lalis@inf.uth.gr
P0 P1
tasks running ready
P2
blocked blocked
P1 καλεί yield()
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 54 lalis@inf.uth.gr
Ουρές αναμονής
• Στη συμβατική λειτουργία resume ο καλών πρέπει
να γνωρίζει την διεργασία που θέλει να αφυπνίσει
• ο προγραμματιστής πρέπει να δώσει το αναγνωριστικό της
• Τι γίνεται όμως αν η σχέση αναμονής/αφύπνισης
μεταξύ των διεργασιών είναι «απρόσωπη»;
• αναλογία με μια συμβατική υπηρεσία στα ανθρώπινα
συστήματα: «να περάσει ο επόμενος παρακαλώ»
• Ουρές αναμονής
• όταν μια διεργασία επιθυμεί να περιμένει για τον λόγο Χ
«μπαίνει» στην ουρά που έχει προσυμφωνηθεί για το Χ,
και απενεργοποιείται
• αντίστοιχα, η αφύπνιση γίνεται απομακρύνοντας
μια (π.χ., την πρώτη) διεργασία από την ουρά Χ,
και θέτοντας την σε κατάσταση λειτουργίας
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 55 lalis@inf.uth.gr
Ενδεικτικές λειτουργίες με ουρές αναμονής
• start(Task *t)
• stop()
• yield()
• suspend(Queue *q):
• τοποθέτηση στην ουρά &
απενεργοποίηση (τρέχουσας) διεργασίας
• resume(Queue *q)
• απομάκρυνση από την ουρά της «επομένης» διεργασίας
& αφύπνιση της
• resumeAll(Queue *q)
• απομάκρυνση & αφύπνιση όλων των διεργασιών της ουράς
Ταυτόχρονος Προγραμματισμός
Προγραμματισμός ΙΙΙ 56 lalis@inf.uth.gr