Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ
Διεργασίες
2
Εισαγωγή Διεργασία: Μία από τις δύο κεντρικές έννοιες και abstractions ενός Λ.Σ. Αποτελεί ένα μοντέλο για ένα πρόγραμμα που εκτελείται Οι διεργασίες εκτελούνται "παράλληλα": δηλ. όχι σειριακά. Υπάρχουν δύο τρόποι: Όσο μια περιφερειακή συσκευή (π.χ. δίσκος) εκτελεί μια εντολή, το Λ.Σ. "δίνει" (dispatches) τη CPU σ' ένα άλλο "έτοιμο" (ready) πρόγραμμα. Όταν η CPU "δίνεται" σ' ένα process, το process συνήθως δεν κρατάει τη CPU μέχρι να τελειώσει, ακόμα και όταν το process δεν κάνει I/O. Κάθε λίγο (π.χ. 100ms) το CPU δίνεται σ' άλλο process. Αυτός ο χρόνος = time slice / quantum. σε κάθε «στιγμή» σ' έναν υπολογιστή εκτελούνται πολλές παράλληλες ενέργειες. Για ν' αντιμετωπίσουν τις δυσκολίες που προκύπτουν, τα Λ.Σ. χρησιμοποιούν την έννοια του process. Προσέξτε: και οι 2 τρόποι δεν είναι δεδομένοι – απαιτείται υποστήριξη από υλικό (Direct mem access, 1ος τρόπος) και από τον αλγόριθμο χρονοπρογραμματισμού!
3
Εισαγωγή multiprogramming: αφορά στο γεγονός ότι πολλές διεργασίες τρέχουν ανά πάσα στιγμή. Ποια η διαφορά μεταξύ «διεργασίας» & "προγράμματος"; Μια διεργασία αντιπροσωπεύει ένα πρόγραμμα που εκτελείται έχει input/output και έχει και μια κατάσταση (state - δηλ. οι τιμές των μεταβλητών του προγράμματος, CPU registers, PC, SP, stack, ...) Η διεργασία που αντιστοιχίζεται σε ένα πρόγραμμα, είναι μια δομή του ΛΣ όπου αποθηκεύονται όλες οι πληροφορίες που χρειάζεται το ΛΣ για να τρέξει το πρόγραμμα σε ένα περιβάλλον πολυπρογραμματισμού. Οι διεργασίες σχηματίζουν μια ιεραρχία πατέρα-παιδιού (ή πρόγονου-απόγονου) (π.χ. Στο UNIX μέσω του fork system call).
4
Εισαγωγή Κατάσταση μιας διεργασίας (ως προς την εκτελεσή της)
τρέχει (running): έχει τη CPU έτοιμο (ready): μπορεί να τρέξει, αλλά η CPU δόθηκε αλλού. μπλοκαρισμένη (blocked): περιμένει «εξωτερικό» γεγονός. 1. περιμένει I/O 2. CPU δίνεται σ' άλλο process 3. CPU δίνεται σ' αυτό το process 4. I/O έγινε Για την μετάβαση (1) υπάρχει συνήθως ένα block system call. Οι μεταβάσεις (2) και (3) προκύπτουν από παρεμβάσεις του scheduler (δρομολογητή/χρονοπρογραμματιστή) του Λ.Σ. Η μετάβαση (4) προκύπτει μετά από διακοπή περιφερειακής συσκευής.
5
Εισαγωγή Πώς και πότε τρέχει ο χρονοπρογραμματιστής; (ποιός τον χρονοπρογραμματίζει;) clock interrupts: αν το time slice του process έχει παρέλθει. block: όταν το τωρινό process μπλοκάρει. Χρησιμοποιώντας το μοντέλο των διεργασιών μπορούμε ευκολότερα ν' αναπαριστούμε τις ενέργειες που εκτελούνται κάθε στιγμή σ' ένα σύστημα. Σ' αυτό το μοντέλο ο χρονοπρογραμματιστής είναι το κατώτερο επίπεδο του Λ.Σ. και κρύβει λεπτομέρειες που αφορούν το σταμάτημα και τρέξιμο διεργασιών και διαχείριση διακοπών (interrupts).
6
Υλοποίηση του PROCESS Περίληψη πληροφορίας για κάθε process:
PC, SP, CPU registers, PSW, signals Πίνακες σελίδων (Page Tables) και άλλες πληροφορίες που αφορούν μνήμη (π.χ. swap space), pointers στα text, data τμήματα της διεργασίας ... pid, parent pid, uid, gid, κατάσταση εκτελεσιμότητας root dir, file descriptors για open files. Υπάρχει ένας πίνακας (process table) που συνήθως (στα συστήματα UNIX) υλοποιείται σαν ένας πίνακας (ή μια συνδεδεμένη λίστα) (of structs). Υπάρχει ένα struct για το κάθε process και καθένα έχει τις παραπάνω πληροφορίες σε διάφορα πεδία του.
7
Υλοποίηση του PROCESS Πώς επιτυγχάνεται ο παραλληλισμός (concurrency - δηλ. ότι υπάρχουν πολλές διεργασίες που τρέχουν) όταν υπάρχει ένα και μοναδικό CPU ; Λόγω του (πιθανού) διαμοιρασμού CPU μέσω των time slices (δηλ. Του χρονομερισμού (timesharing) -- αν εξετάσουμε το σύστημα για μια χρονική στιγμή μεγαλύτερη ενός time slice θα δούμε ότι σ' αυτή τη χρονική στιγμή "τρέχουν" > 1 διεργασίες. Πολλές συσκευές περιφέρειας (peripheral devices) (συνήθως) έχουν δικούς τους επεξεργαστές. Eτσι, όσο ένα I/O (π.χ. σε δίσκο) εκτελείται εκ μέρους μιας διεργασίας, μια άλλη εκτελείται από τη CPU
8
Επικοινωνία Διεργασιών
Συνθήκες Ανταγωνισμού (Race Conditions): περιγράφει καταστάσεις όπου >1 διεργασίες διαβάζουν ή γράφουν σε κοινά δεδομένα και το τελικό αποτέλεσμα εξαρτάται από το πότε τρέχει η κάθε διεργασία. Το πρόβλημα είναι: έλεγχος πρόσβασης σε κοινή μνήμη. Παράδειγμα: Δύο διεργασίες (P1, P2) κάνουν και οι δύο αναλήψεις από ένα τραπεζικό λογαριασμό (κοινό) - η μία ανήκει π.χ. στο σύζυγο και η άλλη αντίστοιχα στη σύζυγο. Η ρουτίνα ΑΝΑΛΗΨΗ καλείται και από τις δύο διεργασίες. ΑΝΑΛΗΨΗ: read (υπολοιπο); if υπολοιπο > ποσό_ανάληψης write (υπολοιπο υπολοιπο – ποσό_ανάληψης);
9
Επικοινωνία Διεργασιών
Το P1 εκτελεί το read() και μετά η CPU δίνεται στο P2 το οποίο εκτελεί read() και write(). Μετά, η CPU δίνεται στο P1 που εκτελεί το write(). μόνο η μία ανάληψη φαίνεται - η άλλη "χάθηκε". Αυτό είναι ένα "τυπικό" race condition. Κρίσιμες περιοχές (Critical Sections): Πώς μπορούμε ν' αποφύγουμε τα race conditions; Πρέπει να βρούμε ένα τρόπο ούτως ώστε μόνο ένα process να έχει πρόσβαση στα κοινά δεδομένα σε κάθε στιγμή. Αυτή η ιδιότητα λέγεται και mutual exclusion (αμοιβαίος αποκλεισμός). ν' απομονώσουμε/κλειδώσουμε το τμήμα του κώδικα το οποίο γράφει/διαβάζει κοινή μνήμη. Αυτό το τμήμα ονομάζεται critical section.
10
Σηματοφόροι-Semaphores
Eνας τύπος μεταβλητών. Στην ουσία "μετράει" όλες τις κλήσεις αφύπνισης για ένα process. Δύο πράξεις: UP & DOWN (σαν τα WAKEUP & SLEEP). DOWN(s) : 1 ατομική ενέργεια (atomic action) { if s = 0 then sleep() else s = s - 1 } UP(s): s: = s + 1 Αν μετά την εκτέλεση του UP(s), s = 1 και υπάρχει κάποιο process που κοιμάται γιατί το s ήταν 0, τότε το σύστημα διαλέγει κάποιο απ' τα μπλοκαρισμένα process και το ξυπνάει. Oλα αυτά που εκτελούνται στο UP() είναι επίσης atomic.
11
Κλασσικά Προβλήματα IPC
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers N φιλόσοφοι κάθονται σ' ένα τραπέζι με N πιάτα φαγητό (σούσι). Για να φάει ένας φιλόσοφος χρειάζεται 2 ξυλάκια (chopsticks) -- δεξιά και αριστερά κάθε πιάτου βρίσκεται από ένα ξυλάκι. Ο κάθε φιλόσοφος περνάει την ζωή του σκεπτόμενος και τρώγοντας, εναλλάξ. Το πρόβλημα είναι να βρεθεί ένας αλγόριθμος για την ζωή των φιλοσόφων που να επιτρέπει τα παραπάνω χωρίς «προβλήματα».
12
Κλασσικά Προβλήματα IPC
13
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
Μια πρώτη λύση για Ν φιλοσόφους: philosopher (i) while (1) { think; take_fork(i); /* πάρε αριστερό ξυλάκι */ take_fork(i+1 mod Ν); /* πάρε δεξί ξυλάκι */ eat; put_fork(i); put_fork(i+1 mod Ν); }
14
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
Ο παραπάνω αλγόριθμος δεν ικανοποιεί! Αν όλοι οι φιλόσοφοι πεινάσουν την ίδια στιγμή και εκτελέσουν τον αλγόριθμο τότε όλοι θα πάρουν το πηρούνι στα αριστερά τους. Όμως κανείς δεν θα καταφέρει να πάρει το δεξί πηρούνι όλοι θα ... πεθάνουν της πείνας. Αυτό είναι ένα γενικότερο και πολύ σημαντικό πρόβλημα για την δημιουργία συστημάτων λογισμικού και λέγεται αδιέξοδο (deadlock).
15
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
Αδιέξοδο προκύπτει όταν >1 processes δημιουργούν μια κυκλική αλυσίδα: όπου το κάθε process για να συνεχίσει χρειάζεται έναν πόρο που τον κατέχει το επόμενο process... Κοκ Πρα Κιτρ Μπλε Πορτ Μωβ Κοκ
16
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
Μια 2η λύση είναι ν' αναγκάσουμε τον κάθε φιλόσοφο, μόλις πάρει το αριστερό ξυλάκι να εξετάσει αν το δεξί είναι διαθέσιμο. Αν ναι, εντάξει. Αλλιώς, αφήνει το αριστερό ξυλάκι και δοκιμάζει πάλι μετά από κάποιο χρονικό διάστημα. Το πρόβλημα μ' αυτή τη λύση είναι λίγο διαφορετικό. Αν όλοι οι φιλόσοφοι αρχίσουν την ίδια στιγμή, ενδέχεται να πάρουν το αριστερό την ίδια στιγμή, να τ' αφήσουν την ίδια στιγμή κ.ο.κ. Αυτό το φαινόμενο ονομάζεται επ’ αόριστον αναβολή (indefinite postponement) ή λιμοκτονία (starvation): οι διεργασίες συνεχίζουν να τρέχουν αλλά δεν σημειώνουν καμία πρόοδο...
17
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
Μια 3η λύση: να δημιουργήσουμε ένα critical section στον αλγόριθμο των φιλοσόφων (μετά το "think") ο οποίος να προστατεύεται από ένα semaphore (mutex = 1). Πριν μπεί στο critical section ο κάθε φιλόσοφος καλεί DOWN(mutex) και μόλις βγει καλεί UP(mutex).
18
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
mutex = 1; philosopher (i) while (1) {think; down(mutex); take_fork(i); /* πάρε αριστερό ξυλάκι */ take_fork(i+1 mod Ν); /* πάρε δεξί ξυλάκι */ eat; put_fork(i); put_fork(i+1 mod Ν); up(mutex); } Η λύση αυτή είναι σωστή; Είναι καλή λύση ;
19
Οι φιλόσοφοι που γευματίζουν - Dining Philosophers
Μια καλύτερη λύση: Χρησιμοποιείται ένα semaphore (mutex = 1) για προστασία critical section. Χρησιμοποιείται ένα semaphore για κάθε φιλόσοφο π.χ. s[1..Ν], για Ν φιλόσοφους. Αρχικά s[i] = 0, i= 1,...,Ν. Τέλος υπάρχει και μία μεταβλητή που αντιπροσωπεύει την κατάσταση ενός φιλόσοφου state[i] (με τιμές : ΣΚΕΦΤΕΤΑΙ, ΠΕΙΝΑΕΙ, ΤΡΩΕΙ). Απαίτηση: Για να φάει ένας φιλόσοφος, κανείς από τους 2 γείτονές του δεν μπορεί να βρίσκεται στην κατάσταση ΤΡΩΕΙ.
20
Το Πρόβλημα Αναγνωστών/Συγγραφέων (Readers & Writers)
Χρησιμοποιείται κυρίως για την μοντελοποίηση προβλημάτων ταυτόχρονης πρόσβασης διαφορετικού τύπου. Πολλοί αναγνώστες (readers) μπορούν ταυτόχρονα να προσπελαύνουν ένα αντικείμενο. Αν όμως το αντικείμενο προσπελαύνεται από έναν συγγραφέα, τότε κανείς άλλος (reader ή writer) δεν μπορεί να προσπελάσει το αντικείμενο. π.χ. τραπεζικοί λογαριασμοί = data items ερωτήσεις για ύψος υπολοίπου = readers αναλήψεις, καταθέσεις = writers
21
Το Πρόβλημα Αναγνωστών/Συγγραφέων (Readers & Writers)
2 σηματοφόροι: ένας (mutex) να προστατεύει το read_count και ένας (item) για τη read-write και write-write σύγκρουση. reader writer while (1) { while (1) { down (mutex); create_data(); read_count ++; down (item) ; if (read_count==1) write_item(); down (item); up (item) up (mutex) ; } read_item(); down (mutex); read_count --; if (read_count == 0) up (item); up (mutex); } Αρχικά, mutex = 1 και item = 1 και read_count = 0. Υπάρχει κάποιο πρόβλημα μ' αυτή την λύση;
22
Χρονοπρογραμματισμός CPU - SCHEDULING
Πότε ένας αλγόριθμος δρομολόγησης είναι "καλός"; Δίκαιος: ισοκατανομή CPU κύκλων στις διεργασίες Αποδοτικός: Συνήθεις μετρικές για να ορισθεί το «αποδοτικός»: CPU utilization (υψηλό ποσοστό χρήσης του CPU) response time: μικρός χρόνος απόκρισης για αλληλεπιδραστικές εφαρμογές - interactive) turnaround time (χρόνος απόκρισης – συστήματα δέσμης) throughput (# διεκπεραιωμένων διεργασιών / μονάδας χρόνου) Συνήθως, δε μπορούμε να ικανοποιήσουμε όλα αυτά ταυτόχρονα !
23
Χρονοπρογραμματισμός CPU - SCHEDULING
Προεκτοπιστικός χρονοπρογραμματισμός: [Preemptive Scheduling]: Οταν ο αλγόριθμος επιτρέπει η CPU να δοθεί σ' άλλο process πριν το τρέχον process να έχει τελειώσει. «Non-preemptive» αλγόριθμοι δίνουν τη CPU σ' ένα process μέχρι να τελειώσει, μετά διαλέγουν άλλο process ... κ.ο.κ. To «preemptive scheduling» δημιουργεί τα προβλήματα που είδαμε σχετικά με ταυτόχρονη πρόσβαση σε κοινή μνήμη. Απ' την άλλη μεριά, το «non-preemptive scheduling» φαίνεται μη εφαρμόσιμο για τις πιο πολλές εφαρμογές (που έχουν πολλά processes στο σύστημα ταυτόχρονα).
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.