Επαναληπτικές ασκήσεις Ασκ 1: Θεωρείστε τα παρακάτω χρονοδιαγράμματα σύγχρονης εκτέλεσης : S 1 = r 1 (A); w 4 (B); w 1 (C); w 3 (D); r 2 (C); w 3 (A); w 1 (A); r 3 (B); w 3 (B); r 2 (D); w 2 (A) S 2 = r 1 (A); w 4 (B); w 1 (C); w 3 (D); r 2 (C); w 1 (A); w 3 (A); r 3 (B); w 3 (B); r 2 (D); w 2 (A) α) Σχεδιάστε τον γράφο προήγησης (precedence graph) για το κάθε χρονοπρόγραμμα β) Είναι το κάθε χρονοδιάγραμμα συγκρουσιακώς σειριόμορφο (conflict serializable)? Αν ναι, δώστε ένα ισοδύναμο σειριακό χρονοδιάγραμμα. Ασκ 2: Βάλτε τα κατάλληλα αποκλειστικά κλειδώματα στα παρακάτω ζεύγη δοσοληψιών ώστε να ικανοποιείται το πρωτόκολλο 2PL για κάθε μια από αυτές. Σε περίπτωση ταυτόχρονης εκτέλεσης, υπάρχει πιθανότητα αδιεξόδου? α) Τ 1 = r 1 (A); r 1 (B); w 1 (C); w 1 (B) Τ 2 = r 2 (D); r 2 (B); w 2 (B); w 2 (D) β) Τ 1 = r 1 (C); r 1 (B); w 1 (C); w 1 (B) Τ 2 = r 2 (B); r 2 (C); w 2 (B); w 2 (C) 116
Αναβάθμιση φραγμών (upgrading locks) Η δοσοληψία που θέλει να διαβάσει και να γράψει ένα στοιχείο, μπορεί πρώτα να αποκτήσει ένα κοινόχρηστο φραγμό για ανάγνωση και μετά να τον αναβαθμίσει (upgrade) σε ένα αποκλειστικό φραγμό για εγγραφή. Παράδειγμα: T1: SL1(A); R1(A); SL1(B); R1(B); XL1(B); W1(B); U1(A); U1(B) T2: SL2(A); R2(A); SL2(B); R2(B); U2(A); U2(B) Αν είχε ζητήσει εξ αρχής XL1(Β), τότε θα περίμενε και δεν θα μπορούσε ούτε καν να διαβάσει το Β. T1 SL1(A); R1(A); SL1(B); R1(B); XL1(B); wait XL1(B); W1(B); U1(A); U1(B); T2 SL2(A); R2(A); SL2(B); R2(B); U2(A); U2(B); 117
Αναβάθμιση φραγμών (upgrading locks) Δυστυχώς, η αναβάθμιση των φραγμών μπορεί να οδηγήσει σε αδιέξοδα (deadlocks) Παράδειγμα: T1 T2 SL1(A); R1(A); XL1(A); wait SL2(A); R2(A); XL2(A); wait Και οι δύο T1 και T2 προσπαθούν να αναβαθμίσουν σε x-lock, αλλά ο scheduler αναγκάζει και τις δύο να περιμένουν γιατί η άλλη έχει ένα s-lock στο Α. 118
Ενημερώσιμοι φραγμοί (update locks) Μπορούμε να αποφύγουμε τα αδιέξοδα που προκαλούνται από την αναβάθμιση φραγμών χρησιμοποιώντας update locks: Ένα update lock ULi(X) επιτρέπει στην δοσοληψία Ti να διαβάσει το X αλλά όχι να γράψει το X Μόνο ένα update lock μπορεί αργότερα να αναβαθμιστεί σε ένα write lock (ένας φραγμός ανάγνωσης δεν μπορεί να αναβαθμιστεί) Μπορούμε να χορηγήσουμε ένα update lock στο X όταν υπάρχουν ήδη shared locks στο X Μόλις υπάρξει ένα update lock στο X, δεν επιτρέπεται η χορήγηση οποιοδήποτε άλλου είδους προσθέτων locks στο X (διαφορετικά μπορεί να μην καταφέρει ποτέ να αναβαθμίσει το lock σε exclusive γιατί υπάρχουν πάντοτε άλλοι φραγμοί) 119
Ενημερώσιμοι φραγμοί (update locks) Παράδειγμα: T1: UL1(A); R1(A); XL1(A); W1(A); U1(A); T2: UL2(A); R2(A); XL2(A); W2(A); U2(A); T1 T2 UL1(A); R1(A); XL1(A); W1(A); U1(A); UL2(A); wait UL2(A); R2(A); XL2(A); W2(A); U2(A); 120
Ενημερώσιμοι φραγμοί (update locks) Πίνακας συμβατότητας φραγμός που απαιτείται φραγμός που κατέχεται S X U S True False True X False False False U False False False 121
Φραγμοί αύξησης (increment locks) Η μόνη πράξη που εκτελούν πολλές δοσοληψίες είναι η αύξηση ή η μείωση των αποθηκευμένων τιμών π.χ. μεταφορά χρημάτων μεταξύ λογαριασμών, κρατήσεις θέσεων Η χρήσιμη ιδιότητα των ενεργειών αυτών είναι ότι μπορούν να αντιμετατεθούν μεταξύ τους αφού η σχετική τους σειρά δεν παίζει σημασία. Όμως, δεν μπορούν να αντιμετατεθούν με πράξεις που γράφουν ή διαβάζουν. Μια πράξη της μορφής INC(A,c), συμβολίζει την αύξηση του στοιχείου Α κατά μια σταθερά c Δηλαδή INC(A,c) σημαίνει: Read(A,t); t:=t+c; Write(A,t); Πράξεις αύξησης χρειάζονται και φραγμούς αύξησης: ILi(X) 122
Φραγμοί αύξησης (increment locks) Η ύπαρξη φραγμών αύξησης μας υποχρεώνει να κάνουμε τις εξής τροποποιήσεις: Μια συνεπής δοσοληψία μπορεί να κάνει μια ενέργεια αύξησης INCi(X) επί του Χ μόνο αν ήδη κατέχει ένα φραγμό αύξησης ILi(X) Σε ένα επιτρεπτό schedule, κάθε χρονική στιγμή οσεσδήποτε δοσοληψίες μπορούν να κατέχουν ένα φραγμό αύξησης επί του Χ. Αν μια δοσοληψία έχει ένα φραγμό αύξησης στο Χ, τότε καμία άλλη δοσοληψία δεν μπορεί να έχει ένα shared ή exclusive lock στο Χ την ίδια στιγμή. INCi(X) συγκρούεται με την Rj(X) και την Wj(X) για j διάφορο του i INCi(X) δεν συγκρούεται με την INCj(X) 123
Φραγμοί αύξησης (increment locks) Παράδειγμα: T1: SL1(A); R1(A); IL1(B); INC1(B); U1(A); U1(B); T2: SL2(A); R2(A); IL2(B); INC2(B); U2(A); U2(B); T1 T2 SL1(A); R1(A); IL1(B); INC1(B); U1(A); U1(B); SL2(A); R2(A); IL2(B); INC2(B); U2(A); U2(B); 124
Φραγμοί αύξησης (increment locks) Πίνακας συμβατότητας φραγμός που απαιτείται φραγμός που κατέχεται S X I S True False False X False False False I False False True 125
Πίνακας φραγμών (lock table) Ο χρονοπρογραμματιστής διατηρεί ένα πίνακα φραγμών A...... Object: A Group mode: U Waiting: yes List: T1 S no T2 U no hash table Εξυπηρέτηση φραγμών σε αναμονή: με σειρά άφιξης ή πρώτα οι S ή πρώτα οι U T3 X yes σε άλλα της Τ3 126
Φραγή σε πολλαπλά επίπεδα λεπτομέρειας Τι αντικείμενα κλειδώνουμε? Το κλείδωμα δουλεύει σε κάθε περίπτωση, αλλά πρέπει να διαλέξουμε μικρά ή μεγάλα αντικείμενα? Αν κλειδώνουμε μεγάλα αντικείμενα (π.χ., relations) Χρειαζόμαστε λιγότερα locks Χαμηλή συγχρονικότητα Αν κλειδώνουμε μικρά αντικείμενα (π.χ., tuples, attributes) Χρειαζόμαστε περισσότερα locks Περισσότερη συγχρονικότητα Relation A Relation B... Tuple A Tuple B Tuple C... Disk Block A Disk Block B Stall 1 Stall 2 Stall 3 Stall 4... DB DB DB Μπορούμε να έχουμε και τα δύο The bathroom metaphor: restroom hall 127
Φραγμοί σε ιεραρχίες από στοιχεία της ΒΔ Υποθέτουμε ότι υπάρχει δενδροειδή δομή δεδομένων Ιεραρχία από αντικείμενα που επιδέχονται φραγμούς (σχέσεις, πλειάδες, ιδιότητες - relations, tuples, attributes) Δεδομένα οργανωμένα σε δέντρα (e.g. B+-tree) Οι φραγμοί που είδαμε μέχρι τώρα δεν αποδίδουν καλά σε τέτοιες περιπτώσεις Τρία επίπεδα από αντικείμενα της ΒΔ: Οι σχέσεις είναι τα μεγαλύτερα αντικείμενα που επιδέχονται φραγμούς (relations) Κάθε σχέση αποτελείται από ένα η περισσότερα δισκοσέλιδα (blocks) Κάθε block περιέχει μια ή περισσότερες πλειάδες (tuples) Π.χ. τράπεζα (block- ή tuple-level locking, μερικές φορές accounts relation), βάση δεδομένων με έγγραφα Χρειαζόμαστε ένα καινούργιο τύπο κλειδώματος που λέγεται προειδοποιητικός φραγμός (warning lock) 128
Προειδοποιητικοί φραγμοί (warning locks) Οι προειδοποιητικοί φραγμοί δηλώνουν την πρόθεση (intention) να αποκτηθεί ένας φραγμός IS: πρόθεση να αποκτηθεί ένας κοινόχρηστος φραγμός IX: πρόθεση να αποκτηθεί ένας αποκλειστικός φραγμός Κανόνες: Για να βάλουμε ένα S ή X lock, ξεκινάμε από την ρίζα Αν καθώς κατεβαίνουμε το δέντρο βρεθούμε στο στοιχείο που θέλουμε να φράξουμε, αιτούμαστε ένα S ή X lock επί του στοιχείου Αν το στοιχείο είναι πιο κάτω στην ιεραρχία, βάζουμε μια προειδοποίηση στο κόμβο που βρισκόμαστε (IS ή IX) Προχωράμε στους θυγατρικούς κόμβους και επαναλαμβάνουμε την διαδικασία μέχρι να φτάσουμε στον επιθυμητό κόμβο. 129
Προειδοποιητικοί φραγμοί (warning locks) Για να αποφασίσουμε αν μπορεί να χορηγηθεί ένας φραγμός, χρησιμοποιούμε την μήτρα συμβατότητας. φραγμός που απαιτείται φραγμός που κατέχεται IS IX S X IS True True True False IX True True False False S True False True False X False False False False 130
Προειδοποιητικοί φραγμοί (warning locks) Ασυμβατότητες: Ένα IS σε κόμβο N είναι ασυμβίβαστο μόνο με ένα X lock στο N Ένα IX σε κόμβο N είναι ασυμβίβαστο με S και X στο N Πιθανές συγκρούσεις με IS/IS, IS/IX, IX/IS and IX/IX θα επιλυθούν σε κατώτερο επίπεδο Ένα S σε κόμβο N είναι συμβατό με IS και S Ένα X σε κόμβο N είναι ασυμβίβαστο με κάθε άλλο τύπο lock Μπορούμε να θέσουμε φραγμούς μόνο σε υπάρχοντα στοιχεία, και όχι σε αυτά που μπορεί να εισαχθούν αργότερα. Για να χειριστούμε εισαγωγές/διαγραφές: Μια δοσοληψία αποκτά exclusive lock στο A πριν το διαγράψει Κατά την εισαγωγή του A, η δοσοληψία αποκτά exclusive lock στο A 131