[Advcomparch] Υλοποίηση lock
Lambros Flokas
lamflokas at gmail.com
Sun Jun 30 11:51:21 EEST 2013
Έχω μια απορία για την υλοποίηση της lock.Δυστυχώς μετά από αρκετές
προσομοιώσεις κατάλαβα ότι κάτι πήγαινε λάθος με την υλοποίηση μου και το
επιβεβαίωσα με το DDEBUG του locks_scalability.Το πρόβλημα είναι ότι ακόμα
δεν είμαι σίγουρος γιατί είναι λάθος η υλοποίηση και δεν μπορώ πλέον να
αντιληφθώ πως θα κάνουμε χρήση της compare and swap (προσπάθησα να βρω
εναλλακτικές εντολές του gcc αλλά αν και δούλευαν στο debug έλεγαν ότι
έχουν κάποιους περιορισμούς οπότε τις άφησα)
Η υλοποίηση μου βασιζόταν στο εξής : Η compare and swap κάνει swap μόνο
όταν το lock είναι oldval αλλά εμείς στο test and set θέλουμε να κάνουμε
set κάθε φορά έτσι κι αλλιώς οπότε σκέφτηκα να του δώσω σαν oldval την ίδια
την τιμή του lock δηλαδή *lock.
Το μόνο που μπορώ να σκεφτώ είναι ότι το *lock παίρνει την τιμή από την
cache ή κάποια μη τρέχουσα τιμή(αν και αμφιβάλλω αφού δηλώνουμε το lock
volatile) και συγκρίνεται με την πρόσφατη τιμή στη μνήμη που είναι
διαφορετική.Τότε αν είναι locked στην cache και unlocked στη μνήμη τότε
τερματίζει η acquire lock αλλά δεν κλειδώνουμε με αποτέλεσμα ο επόμενος να
το βρίσκει ξεκλείδωτο οπότε να μπαίνει και αυτός στην κρίσιμη περιοχή.
Δεν ξέρω αν η παραπάνω είναι η σωστή εξήγηση οπότε μια
επιβεβαίωση/διόρθωση είναι ευπρόσδεκτη.
Αυτό που δεν καταλαβαίνω είναι πώς θα μετατρέψω την compare and swap σε μια
απλή ατομική εντολή set.Ίσως μπορεί κάποιος να δώσει καμιά ιδέα
Επίσης μια ακόμη ερώτηση είναι αν το release πρέπει να γίνει και αυτό
ατομικά ή όχι και αν ναι γιατί;
Ευχαριστώ πολύ εκ των προτέρων,
Λάμπρος Φλόκας
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cslab.ece.ntua.gr/pipermail/advcomparch/attachments/20130630/84000732/attachment.html>
More information about the Advcomparch
mailing list