Professional Documents
Culture Documents
CPU - SCHEDULING
• Όταν πολλές διεργασίες βρίσκονται στην
κατάσταση RUNNABLE / READY, ποιο process
θα πάρει τη CPU; Αυτό το αποφασίζει εκείνο το
τμήμα του Λ.Σ. που λέγεται scheduler
(scheduling algorithm).
• Ποιός χρονοπρογραμματίζει τον
χρονοπρογραμματιστή; Ο scheduler καλείται:
– από την ρουτίνα εξυπηρέτησης διακοπής ρολογιού
(clock interrupt service routine) και
– από την ρουτίνα block() του kernel (που καλείται όταν
το τρέχον process θα μπλοκάρει).
Χρονοπρογραμματισμός
CPU - SCHEDULING
Πότε ένας αλγόριθμος δρομολόγησης είναι "καλός";
• Δίκαιος: ισοκατανομή CPU κύκλων στις διεργασίες
• Αποδοτικός:
– CPU utilization (υψηλό ποσοστό χρήσης του CPU)
– response time: μικρός χρόνος απόκρισης για αλληλεπιδραστικές
εφαρμογές - interactive)
– turnaround time (χρόνος απόκρισης – συστήματα δέσμης)
– throughput (# διεκπεραιωμένες διεργασίες / μονάδα χρόνου)
Δεν μπορούμε να ικανοποιήσουμε όλα αυτά ταυτόχρονα !
(περιβάλλον χρήσης: batch εναντίον interactive).
Χρονοπρογραμματισμός
CPU - SCHEDULING
• Τύπος Διεργασίας: Φραγμένη από I/0 ή CPU;
(I/O / CPU – bound) ;
– Σε κάθε "τικ" το clock interrupt service routine καλεί
τον scheduler ο οποίος εξετάζει αν το τρέχον process
έχει χρησιμοποιήσει τη CPU αρκετά. Αν ναί, τότε
κάποιο άλλο process (αυτό που θα διαλέξει ο
αλγόριθμος δρομολόγησης θα τρέξει).
– Αν όμως το τρέχον process είναι I/O-bound τότε
συνήθως θα μπλοκάρει συχνά, και έτσι θα
χρησιμοποιεί λιγότερο το CPU απ' ότι ένα CPU-bound
process.
– Στόχος πρέπει να είναι να υπάρχει ένα καλό μείγμα
από τους 2 τύπους διεργασιών προς εκτέλεση κάθε
στιγμή. Γιατι;
Χρονοπρογραμματισμός
CPU - SCHEDULING
Προεκτοπιστικός χρονοπρογραμματισμός:
[Preemptive Scheduling]:
• Οταν ο αλγόριθμος επιτρέπει στη CPU να δοθεί σ' άλλο
process πριν το τρέχον process να έχει τελειώσει.
• Non-preemptive αλγόριθμοι δίνουν το CPU σ' ένα
process μέχρι να τελειώσει, μετά διαλέγουν άλλο process
... κ.ο.κ.
• To preemptive scheduling δημιουργεί τα προβλήματα
που είδαμε σχετικά με ταυτόχρονη πρόσβαση σε κοινή
μνήμη.
• Απ' την άλλη μεριά, non-preemptive scheduling φαίνεται
μη εφαρμόσιμο για τις πιο πολλές εφαρμογές (που έχουν
πολλά processes στο σύστημα ταυτόχρονα).
Χρονοπρογραμματισμός εκ
περιτροπής (Round Robin)
• Απλός, δίκαιος, και πιο πολύ-χρησιμοποιημένος
αλγόριθμος!.
• Το κάθε process έχει ένα time quantum (ή time slice).
Eτσι θα τρέξει για ένα διάστημα ίσο με το time slice, μετά
το CPU θα δοθεί σε κάποιο άλλο process, κ.ο.κ.
• Αν το process μπλοκάρει πριν το time slice παρέλθει,
τότε πάλι το CPU θα δοθεί σ' άλλο process.
Απλή υλοποίηση!
• context switch:
– Η διαδικασία κατά την οποία δίνεται το CPU σ' άλλο process
αποκαλείται CPU switch, process switch, & context switch.
Χρονοπρογραμματισμός εκ
περιτροπής (Round Robin)
• Ο χρόνος που απαιτείται για το context switch
είναι σημαντικός: αλλαγή "περιβάλλοντος":
– σώσιμο regs, PC, SP, ... στη δομή για το τρέχον process στο
Process Table,
– φόρτωμα των regs, PC, SP από τη δομή για το επόμενο process
στο Process Table, αλλαγή Page Tables, ...κ.ο.κ.
• Η αποδοτικότητα του Round-Robin αλγόριθμου
εξαρτάται από την διάρκεια του quantum (σε σχέση και
με τον χρόνο που απαιτείται για context switch).
– Μεγάλο quantum μεγάλος χρόνος απόκρισης για interactive
χρήστες.
– Μικρό quantum για μεγάλα ποσοστά του χρόνου το CPU
χρησιμοποιείται για context switch.
Χρονοπρογραμματισμός Με
Προτεραιότητες
• Ο αλγόριθμος Round-Robin είναι χρήσιμος όταν όλα τα
processes έχουν την ίδια σπουδαιότητα. Αυτό όμως δεν ισχύει
συχνά!
• Σε μερικές εφαρμογές, processes κάποιων χρηστών έχουν
μεγαλύτερη προτεραιότητα (π.χ. Διεργασίες ασφάλειας,
στρατηγών, καλών πελατών). Γενικά, ο αλγόριθμος διαλέγει το
process με την μεγαλύτερη προτεραιότητα.
• Συχνά, η προτεραιότητα ενός process μεταβάλλεται με το χρόνο
και εξαρτάται από το πόσα CPU cycles έχει ήδη
χρησιμοποιήσει.
•
Tο παράδειγμα δείχνει ότι το SJF είναι βέλτιστο (μπορεί ν' αποδειχθεί εύκολα).
Η Μικρότερη Δουλειά Πρώτη σε
Αλληλεπιδραστικά Περιβάλλοντα
• Μιας και to SJF ελαχιστοποιεί τον χρόνο απόκρισης είναι
επιθυμητό να τον χρησιμοποιήσουμε και για interactive
συστήματα. Για να γίνει όμως αυτό πρέπει να μπορούμε
να υπολογίσουμε πόσο CPU χρόνο απαιτεί κάθε process
(ή μάλλον κάθε εντολή που ένας χρήστης
πληκτρολόγησε στο τερματικό του).
• Eστω ότι εκτιμήθηκε ότι ένα job χρειάζεται χρόνο T0.
– Oταν τρέχει σημειώνεται ότι χρησιμοποίησε το CPU για χρόνο
T1. Τότε ενημερώνουμε την εκτίμηση μας με βάση Τ0 & Τ1. π.χ.
– Τ0 = αΤ0 + (1-α)Τ1 αποτελεί την καινούργια εκτίμηση.
– Την επόμενη φορά που τρέχει το ίδιο job σημειώνουμε ότι πήρε
χρόνο T2. Τότε ενημερώνουμε την εκτίμησή μας με βάση Τ0 &
T2. π.χ.
– Τ0 = α Τ0 + (1-α) T2
Η Μικρότερη Δουλειά Πρώτη σε
Αλληλεπιδραστικά Περιβάλλοντα
Αν α=1/2
Τ0 = (Τ0 / 2) + (Τ1 / 2),
Τ0 = (Τ0 / 4) + (Τ1 / 4) + (Τ2 / 2), ....
Όσο πιο μικρή η τιμή του α, τόσο πιο
γρήγορα ξέχνιονται οι παλιές
εκτιμήσεις....
Δυστυχώς το SJF δεν είναι βέλτιστο
όταν όλα τα jobs που θα δρομολογηθούν
δεν είναι γνωστά εκ προοιμίου.
Φτιάξε ένα δικό σας παράδειγμα που να
δείχνει αυτό.
Χρονοπρογραμματισμός με
εγγυήσεις - Guaranteed Sched.
• Βασική ιδέα: Δώσε εγγυήσεις σε κάθε χρήστη
αναφορικά με το πόσα CPU cycles θα δοθούν στο
process του. π.χ.
– Αν υπάρχουν Ν χρήστες, τότε όλοι θα πάρουν 1/Ν των CPU cycles.
• Η υλοποίηση:
1. Το Λ.Σ. υπολογίζει πόσο CPU χρόνο έχει πάρει το κάθε
process.
2. Επίσης, υπολογίζει πόσο χρόνο έπρεπε να είχε πάρει
(login time/N).
3. Μετά υπολογίζει τον λόγο των (1) και (2).
4. Ο αλγόριθμος διαλέγει το process με τον μικρότερο
λόγο, το οποίο τρέχει μέχρι ο λόγος του να γίνει
μεγαλύτερος κάποιου άλλου process.
Διαχωρισμός Πολιτικής & Μηχανισμού
Χρονοπρογραμματισμού
• Ο διαχωρισμός αυτός είναι καλή ιδέα γενικά και όχι μόνο για
scheduling.
• Η πολιτική αναφέρεται στην "φιλοσοφία" του αλγόριθμου.
• Ο μηχανισμός αναφέρεται κυρίως στην "υλοποίηση" του
αλγορίθμου.
(2-Level Scheduling)
• Μοντέρνα συστήματα συνήθως έχουν πολλά (πολλές
φορές) μεγάλα processes που θέλουν να τρέξουν.
Eπειδή η Κ.Μ. κοστίζει πολύ, είναι συνήθως μικρή
δεν χωράνε όλα τα processes στην κύρια μνήμη.
• Η δρομολόγηση των processes σ' αυτά τα συστήματα
γίνεται ως εξής:
– short-term scheduling: Αφορά την δρομολόγηση που
έχουμε δει μέχρι τώρα. Δηλ. διαλέγει ποίο από τα processes
που βρίσκονται στην Κ.Μ. θα τρέξει
– Long-term scheduling: Υπεύθυνο για να καθορίζει ποία από
όλα τα processes που θέλουν να τρέξουν θα εισέλθουν στην
κύρια μνήμη.
ΠολυΕπίπεδος Χρονοπρογραμματισμός
(2-Level Scheduling)
• Eτσι, αντί να έχουμε έναν μονολιθικό αλγόριθμο
που λαμβάνει υπ' όψιν του το κόστος για context
switch ενός process που βρίσκεται στο δίσκο,
υπάρχει ο παραπάνω διαχωρισμός ευθυνών.