Συγχρονισμός. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Συγχρονισμός. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων"

Transcript

1 Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Συγχρονισμός 9 ο Εξάμηνο

2 Σύνοψη Το πρόβλημα του συγχρονισμού Βασικοί μηχανισμοί Κλειδώματα και υλοποιήσεις Condition variables Τακτικές συγχρονισμού Coarse-grain locking Fine-grain locking Optimistic synchronization Lazy synchronization Non-blocking synchronization 2

3 Η ανάγκη για συγχρονισμό Ταυτόχρονη πρόσβαση σε κοινά δεδομένα μπορεί να οδηγήσει σε ασυνεπή εκτέλεση Το πρόβλημα του κρίσιμου τμήματος (critical section): το πολύ μία διεργασία πρέπει να βρίσκεται στο κρίσιμο τμήμα σε κάθε χρονική στιγμή Δεν μας ενδιαφέρει η σειρά εκτέλεσης, αλλά η συντονισμένη πρόσβαση στα κοινά δεδομένα Η σωστή παράλληλη εκτέλεση απαιτεί συγκεκριμένη σειρά εκτέλεσης, όπως π.χ. επιβάλλεται από το γράφο εξαρτήσεων Το πρόβλημα της σειριοποίησης (ordering) Υπάρχει αυστηρά προκαθορισμένη σειρά με την οποία πρέπει να εκτελεστούν οι εργασίες

4 Άλλα patterns συγχρονισμού Φράγμα συγχρονισμού (barrier) Όλες οι διεργασίες που συμμετέχουν συγχρονίζονται σε ένα συγκεκριμένο σημείο κώδικα Ειδική περίπτωση της σειριοποίησης Αναγνώστες-εγγραφείς (readers writers) Στο «κρίσιμο τμήμα» επιτρέπεται να είναι είτε: Καμία διεργασία Οσεσδήποτε διεργασίες αναγνώστες Μία διεργασία εγγραφέας Παραγωγός-καταναλωτής (producer consumer) Φραγμένος αριθμός από προϊόντα (0 < items < N) Ο παραγωγός εισέρχεται στο «κρίσιμο τμήμα» όταν items < N Ο καταναλωτής εισέρχεται στο «κρίσιμο τμήμα» όταν items > 0 Χρειάζεται συγχρονισμένη πρόσβαση στη δομή που κρατάει τα προϊόντα αν items = 1 (και συγχρονισμένη ενημέρωση του μετρητή items) 4

5 Μηχανισμοί συγχρονισμού Κλειδώματα (locks) Προστατεύει ένα τμήμα κώδικα από ταυτόχρονη πρόσβαση Μόνο η διεργασία που έχει λάβει το κλείδωμα μπορεί να προχωρήσει Σημαφόροι (semaphores) Ακέραιος αριθμός στον οποίο επιτρέπονται 3 ενέργειες Αρχικοποίηση Αύξηση της τιμής κατά 1 Μείωση της τιμής κατά 1 και μπλοκάρισμα αν η νέα τιμή είναι 0 (ή αρνητική ανάλογα με την υλοποίηση) Παρακολουθητές (monitors) και condition variables Ζεύγος κλειδώματος και condition variable (m, c) Μία διεργασία αναστέλλει τη λειτουργία της (λειτουργία wait) μέχρι να ισχύσει η κατάλληλη συνθήκη Μία διεργασία «ξυπνάει» (λειτουργία signal) κάποια από (ή όλες) τις διεργασίες που περιμένουν 5

6 Το πρόβλημα του κρίσιμου τμήματος (και οι ιδιότητές του) 1. Αμοιβαίος αποκλεισμός (mutual exclusion) 2. Πρόοδος (deadlock free) 3. Πεπερασμένη αναμονή (starvation free) Τα 1 και 2 είναι αναγκαία, το 3 επιθυμητό

7 Το κλείδωμα ως λύση του κρίσιμου τμήματος do { lock(mylock); /* critical section */ code unlock(mylock); remainder section while (TRUE); do { lock(mylock); /* critical section */ other code unlock(mylock); other remainder section while (TRUE);

8 Το κλείδωμα ως λύση του κρίσιμου τμήματος do { lock(mylock); /* critical section */ code unlock(mylock); remainder section while (TRUE); do { lock(mylock); /* critical section */ other code unlock(mylock); other remainder section while (TRUE); Πώς υλοποιείται ένα σωστό και «καλό» κλείδωμα;

9 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα // i = εγώ // j = το άλλο νήμα public void lock() { flag[i] = true; victim = i; while (flag[j] && victim == i) {; public void unlock() { flag[i] = false;

10 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα // i = εγώ «Θέλω να μπω» // j = το άλλο νήμα public void lock() { flag[i] = true; victim = i; while (flag[j] && victim == i) {; public void unlock() { flag[i] = false;

11 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα // i = εγώ «Θέλω να μπω» // j = το άλλο νήμα public void lock() { flag[i] = true; victim = i; while (flag[j] && victim == i) {; public void unlock() { flag[i] = false; Παραχώρηση προτεραιότητας «Μπες εσύ»

12 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα // i = εγώ // j = το άλλο νήμα public void lock() { flag[i] = true; victim = i; while (flag[j] && victim == i) {; public void unlock() { flag[i] = false; «Θέλω να μπω» Παραχώρηση προτεραιότητας «Μπες εσύ» Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα

13 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα Νήμα 1 Νήμα 2 «Θέλω να μπω» «Θέλω να μπω» «Μπες εσύ» «Μπες εσύ» χρόνος Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα

14 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα Νήμα 1 Νήμα 2 «Θέλω να μπω» «Θέλω να μπω» «Μπες εσύ» «Μπες εσύ» χρόνος Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Μπαίνει στο κρίσιμο τμήμα Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Μπλοκάρει

15 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα Νήμα 1 Νήμα 2 «Θέλω να μπω» «Θέλω να μπω» «Μπες εσύ» «Μπες εσύ» χρόνος Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Αν ο compiler ή ο επεξεργαστής αναδιατάξει την 1 η εντολή: Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα

16 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα Νήμα 1 Νήμα 2 «Θέλω να μπω» «Θέλω να μπω» «Μπες εσύ» «Μπες εσύ» χρόνος Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα

17 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα Νήμα 1 Νήμα 2 «Μπες εσύ» «Θέλω να μπω» «Μπες εσύ» χρόνος Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα «Θέλω να μπω»

18 Λύση στο λογισμικό: Peterson s lock δουλεύει για 2 νήματα Νήμα 1 Νήμα 2 «Μπες εσύ» «Θέλω να μπω» «Μπες εσύ» χρόνος Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα Μπαίνει στο κρίσιμο τμήμα Αν το άλλο νήμα θέλει να μπει και έχει προτεραιότητα περιμένω, αλλιώς μπαίνω στο κρίσιμο τμήμα «Θέλω να μπω» Μπαίνει στο κρίσιμο τμήμα

19 class Bakery { boolean[] flag; Label[] label; int size; Λύση στο λογισμικό: Lamport s Bakery Algorithm public Bakery (int n) { flag = new boolean[n]; label = new Label[n]; for (int i = 0; i < n; i++) { flag[i] = false; label[i] = 0; public void lock() { int i = ThreadID.get(); flag[i] = true; label[i] = max(label[0],, label[n-1]) + 1; while ((Эk!= i)(flag[k] && (label[k],k) << label[i],i))) {; public void unlock() { flag[threadid.get()] = false;

20 class Bakery { boolean[] flag; Label[] label; int size; Λύση στο λογισμικό: Lamport s Bakery Algorithm «Θέλω να μπω» public Bakery (int n) { flag = new boolean[n]; label = new Label[n]; for (int i = 0; i < n; i++) { flag[i] = false; label[i] = 0; public void lock() { int i = ThreadID.get(); flag[i] = true; label[i] = max(label[0],, label[n-1]) + 1; while ((Эk!= i)(flag[k] && (label[k],k) << label[i],i))) {; public void unlock() { flag[threadid.get()] = false;

21 class Bakery { boolean[] flag; Label[] label; int size; public Bakery (int n) { flag = new boolean[n]; label = new Label[n]; for (int i = 0; i < n; i++) { flag[i] = false; label[i] = 0; Λύση στο λογισμικό: Lamport s Bakery Algorithm «Θέλω να μπω» Παίρνει σειρά προτεραιότητας public void lock() { int i = ThreadID.get(); flag[i] = true; label[i] = max(label[0],, label[n-1]) + 1; while ((Эk!= i)(flag[k] && (label[k],k) << label[i],i))) {; public void unlock() { flag[threadid.get()] = false;

22 class Bakery { boolean[] flag; Label[] label; int size; Λύση στο λογισμικό: Lamport s Bakery Algorithm «Θέλω να μπω» public Bakery (int n) { flag = new boolean[n]; label = new Label[n]; for (int i = 0; i < n; i++) { flag[i] = false; label[i] = 0; public void lock() { int i = ThreadID.get(); flag[i] = true; label[i] = max(label[0],, label[n-1]) + 1; while ((Эk!= i)(flag[k] && (label[k],k) << label[i],i))) {; public void unlock() { flag[threadid.get()] = false; Παίρνει σειρά προτεραιότητας Αναμονή μέχρι να έρθει η προτεραιότητά μου Αν 2 νήματα έχουν αποκτήσει τον ίδιο αριθμό προτεραιότητας, λαμβάνεται υπόψη το id τους

23 class Bakery { boolean[] flag; Label[] label; int size; Λύση στο λογισμικό: Lamport s Bakery Algorithm public Bakery (int n) { flag = new boolean[n]; label = new Label[n]; for (int i = 0; i < n; i++) { flag[i] = false; label[i] = 0; public void lock() { int i = ThreadID.get(); flag[i] = true; label[i] = max(label[0],, label[n-1]) + 1; while ((Эk!= i)(flag[k] && (label[k],k) << label[i],i))) {; «Δεν θέλω να μπω» public void unlock() { flag[threadid.get()] = false;

24 Ζητήματα λύσεων στο λογισμικό Βασίζονται σε απλές αναγνώσεις και εγγραφές στη μνήμη (+) Το κλείδωμα του Peterson: Λειτουργεί μόνο για 2 διεργασίες (-) Δεν λειτουργεί αν ο μεταγλωττιστής ή ο επεξεργαστής δεν αναδιατάξουν εντολές (-) Στο μεταγλωττιστή μπορώ να το επιβάλλω Στον επεξεργαστή χρειάζεται ειδική εντολή (memory fence) To κλείδωμα του Lamport Λειτουργεί για Ν διεργασίες (+) Διατρέχει Ν θέσεις μνήμης και αυτό μπορεί να είναι πολύ αργό και μη κλιμακώσιμο για μεγάλα Ν (-) 24

25 Υποστήριξη από το υλικό: atomic operations, π.χ. test-and-set, compare-and-swap Ατομικά ενεργούν σε 2 μεταβλητές 0 State Test (0 = unlocked 1 = locked)

26 Υποστήριξη από το υλικό: atomic operations, π.χ. test-and-set, compare-and-swap Ατομικά ενεργούν σε 2 μεταβλητές State Test (0 = unlocked 1 = locked)

27 Υποστήριξη από το υλικό: atomic operations, π.χ. test-and-set, compare-and-swap Ατομικά ενεργούν σε 2 μεταβλητές 1 Με ένα ατομικό operation θέτω το lock (State=1) και «βλέπω» την προηγούμενη κατάσταση (στη μεταβλητή Test) State Test (0 = unlocked 1 = locked)

28 Υποστήριξη από το υλικό: atomic operations, π.χ. test-and-set, compare-and-swap Ατομικά ενεργούν σε 2 μεταβλητές 1 Με ένα ατομικό operation θέτω το lock (State=1) και «βλέπω» την προηγούμενη κατάσταση (στη μεταβλητή Test) State (0 = unlocked 1 = locked) Test Αν test = 0 (ήταν «ξεκλείδωτα») μπαίνω στο critical section, αλλιώς περιμένω

29 Test-and-set (TAS) lock class TASlock { AtomicBoolean state = new AtomicBoolean(false); void lock() { while (state.getandset(true)) { void unlock() { state.set(false);

30 TAS lock in a bus-based multiprocessor Thread 1 inside critical section CPU0 CPU1 CPU2 Memory state test cache 1 0 cache cache state test 1 0 bus

31 TAS lock in a bus-based multiprocessor Thread 1 inside critical section CPU0 Thread 2 tries to enter critical section CPU1 while (state.getandset(true)) { Thread 3 tries to enter critical section CPU2 while (state.getandset(true)) { Memory state test cache 1 0 cache cache state test 1 0 bus

32 TAS lock in a bus-based multiprocessor Thread 1 inside critical section CPU0 Thread 2 tries to enter critical section CPU1 while (state.getandset(true)) { Thread 3 tries to enter critical section CPU2 while (state.getandset(true)) { Memory state test cache 1 1 state test cache 1 1 state test cache 1 1 state test 1 1 bus

33 TAS lock in a bus-based multiprocessor Thread 1 inside critical section CPU0 Thread 2 tries to enter critical section CPU1 while (state.getandset(true)) { Thread 3 tries to enter critical section CPU2 while (state.getandset(true)) { Memory state test cache 1 1 state test cache 1 1 state test cache 1 1 state test 1 1 bus Υπερβολική χρήση του διαδρόμου λόγω πρωτοκόλλου συνάφειας κρυφής μνήμης

34 Test and test and set (TTAS) lock class TTASlock { AtomicBoolean state = new AtomicBoolean(false); void lock() { while (true) { while (state.get()) {; if (!state.getandset(true)) return; void unlock() { state.set(false);

35 Test and test and set (TTAS) lock class TTASlock { AtomicBoolean state = new AtomicBoolean(false); «Επίμονο» διάβασμα της void lock() { κατάστασης του lock while (true) { while (state.get()) {; if (!state.getandset(true)) return; void unlock() { state.set(false);

36 Test and test and set (TTAS) lock class TTASlock { AtomicBoolean state = new AtomicBoolean(false); «Επίμονο» διάβασμα της κατάστασης του lock void lock() { while (true) { while (state.get()) {; if (!state.getandset(true)) return; void unlock() { state.set(false); Αν είναι «ξεκλείδωτο» το διεκδικώ

37 Επίδοση TAS vs TTAS TAS lock time TTAS lock Ideal threads

38 Επίδοση TAS vs TTAS TAS lock time TTAS lock Ideal threads Περαιτέρω βελτίωση: TTAS + εκθετική οπισθοχώρηση (exponential backoff)

39 Scalable locks Σε ένα σύστημα κοινής μνήμης δεν είναι καλή ιδέα πολλά threads να «συνωστίζονται» σε μία κοινή θέση μνήμης Δημιουργείται μεγάλη κυκλοφορία δεδομένων από το σύστημα συνάφειας κρυφής μνήμης Προτιμούμε τα νήματα να εργάζονται το καθένα στο δικό του χώρο και να έχουν πρόσβαση σε κοινές θέσεις σπάνια και με λογική point-to-point, π.χ. 2 νήματα ανά θέση μνήμης

40 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

41 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); Τοπική μεταβλητή ανά thread Πίνακας-ουρά με αριθμό θέσεων ίσο με τον αριθμό των threads Δείκτης στο τέλος της ουράς public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

42 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true; 6 5 false false 7 false false 4 tail 0 true false 3 0 false false 2 Alock mylock = new Alock(8); /* Thread code */ mylock.lock(); /* critical section */ mylock.unlock(); 1

43 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); 6 5 false false 7 false false 4 tail 1 0 true false 3 1 false false 2 Thread A mylock.lock() public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

44 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); 6 5 false false 7 false false 4 tail 2 0 true false 3 1 false false 2 Thread A in CS Thread B mylock.lock() public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

45 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); 6 5 false false 7 false false 4 tail 3 0 true false 3 1 false false 2 Thread A in CS Thread B mylock.lock() Thread C mylock.lock() public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

46 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); 6 5 false false 7 false false 4 tail 3 0 false false 3 1 true false 2 Thread A mylock.unlock() Thread B mylock.lock() Thread C mylock.lock() public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

47 Queue Locks: Array-based lock class ALock { ThreadLocal<Integer> myslotindex; boolean[] flag; AtomicInteger tail; int size; public Alock (int capacity) { size = capacity; flag = new boolean[capacity]; flag[0] = true; tail = new AtomicInteger(0); 6 5 false false 7 false false 4 tail 3 0 false false 3 1 true false 2 Thread B In CS Thread C mylock.lock() public void lock() { int slot = tail.getandincrement() % size; myslotindex.set(slot); while (!flag[slot]){; public void unlock() { int slot = myslotindex.get(); flag[slot] = false; flag[(slot + 1) % size] = true;

48 Επισημάνσεις Η επίδοση κάθε μηχανισμού κλειδώματος εξαρτάται από τη συμφόρηση Αριθμός νημάτων Μέγεθος κρίσιμου τμήματος Μέγεθος μη-κρίσιμου τμήματος Δεν υπάρχει ένα κλείδωμα για όλες τις περιπτώσεις Υβριδικές προσεγγίσεις έχουν νόημα Οι παραπάνω υλοποιήσεις αφορούν spinlocks ο επεξεργαστής είναι κατειλημμένος όσο ένα νήμα επιχειρεί να εισέλθει στο κρίσιμο τμήμα Μπορούν να συνδυαστούν ορθογώνια με προσεγγίσεις όπου το νήμα απελευθερώνει τον επεξεργαστή μετά από κάποιο χρονικό διάστημα 48

49 Monitors και Condition Variables Η ορθή υλοποίηση σύνθετων προγραμμάτων με τη χρήση κλειδωμάτων είναι δύσκολη και συχνά οδηγεί σε σφάλματα Είναι επιθυμητό να αναθέτουμε μέρος της υλοποίησης του συγχρονισμού σε κάποια βιβλιοθήκη ή στον compiler Ο πραγματικός σχεδιασμός και ο εντοπισμός των αναγκών του συγχρονισμού παραμένει Ο προγραμματιστής προτιμά να περιγράφει το «τι» και όχι το «πως» 49

50 Monitors Τα monitors (παρακολουθητές) είναι δομές συγχρονισμού υψηλού επιπέδου Υποστηρίζουν: Ατομική εκτέλεση των μεθόδων που ορίζονται εντός ενός monitor (η κατάλληλη χρήση των κλειδωμάτων για το σκοπό αυτό γίνεται από τον compiler αυτόματα) Αναμονή ενός νήματος μέχρι να ικανοποιηθεί κάποια συνθήκη με τη χρήση condition variables 50

51 Condition variables Εξομοιώνουν μία αίθουσα αναμονής στην οποία εισέρχονται νήματα μέχρι να ικανοποιηθεί μία συνθήκη (π.χ. να απελευθερωθεί χώρος σε μία γεμάτη ουρά) Υποστηρίζουν λειτουργίες αναστολής λειτουργίας (wait) ενός νήματος αν δεν ισχύει μία συνθήκη και ειδοποίησης των νημάτων σε αναμονή (signal) όταν ισχύει η συνθήκη Εμπλέκουν το λειτουργικό σύστημα για την αναστολή λειτουργίας και την ενημέρωση Συνδέονται με ένα κλείδωμα Ο έλεγχος της συνθήκης γίνεται υπό την κατοχή κλειδώματος Η αναστολή λειτουργίας έπεται της απελευθέρωσης του κλειδώματος Η ανάνηψη από την αναμονή έπεται της επανάκτησης του κλειδώματος 51

52 Condition variables - διεπαφή public interface Lock { void lock(); void lockinterruptibly() throws InterruptedException; boolean trylock(); boolean trylock(long time, TimeUnit unit); Condition newcondition(); void unlock(); public interface Condition { void await() throws InterruptedException; boolean await(long time, TimeUnit unit) throws InterruptedException; boolean awaituntil(date deadline) throws InterruptedException; long awaitnanos(long nanostimeout) throws InterruptedException; void awaituninterruptibly(); void signal(); // wake up one waiting thread void signalall(); // wake up all waiting threads 52

53 class Queue<T> { final Lock lock = new ReentrantLock(); final Condition notfull = lock.newcondition(); final Condition notempty = lock.newcondition(); final T[] items; int tail, head, count; public Queue(int capacity) { items = (T[])new Object[capacity]; public void enq(t x) throws InterruptedException { lock.lock(); try { while (count == items.length) notfull.await(); items[tail] = x; if (++tail == items.length) tail = 0; ++count; notempty.signal(); finally { lock.unlock(); LockedQueue enq() Λήψη lock 53

54 class Queue<T> { final Lock lock = new ReentrantLock(); final Condition notfull = lock.newcondition(); final Condition notempty = lock.newcondition(); final T[] items; int tail, head, count; public Queue(int capacity) { items = (T[])new Object[capacity]; public void enq(t x) throws InterruptedException { lock.lock(); try { while (count == items.length) notfull.await(); items[tail] = x; if (++tail == items.length) tail = 0; ++count; notempty.signal(); finally { lock.unlock(); LockedQueue enq() Έλεγχος συνθήκης και αναστολή λειτουργίας. Απελευθέρωση του lock εντός της await() 54

55 class Queue<T> { final Lock lock = new ReentrantLock(); final Condition notfull = lock.newcondition(); final Condition notempty = lock.newcondition(); final T[] items; int tail, head, count; public Queue(int capacity) { items = (T[])new Object[capacity]; public void enq(t x) throws InterruptedException { lock.lock(); try { while (count == items.length) notfull.await(); items[tail] = x; if (++tail == items.length) tail = 0; ++count; notempty.signal(); finally { lock.unlock(); LockedQueue enq() Συνέχιση μετά από «ξύπνημα» με το lock σε κατοχή 55

56 class Queue<T> { final Lock lock = new ReentrantLock(); final Condition notfull = lock.newcondition(); final Condition notempty = lock.newcondition(); final T[] items; int tail, head, count; public Queue(int capacity) { items = (T[])new Object[capacity]; public void enq(t x) throws InterruptedException { lock.lock(); try { while (count == items.length) notfull.await(); items[tail] = x; if (++tail == items.length) tail = 0; ++count; notempty.signal(); finally { lock.unlock(); LockedQueue enq() Ειδοποίηση σε κάθε περίπτωση 56

57 class Queue<T> { final Lock lock = new ReentrantLock(); final Condition notfull = lock.newcondition(); final Condition notempty = lock.newcondition(); final T[] items; int tail, head, count; public Queue(int capacity) { items = (T[])new Object[capacity]; public T deq() throws InterruptedException { lock.lock(); try { while (count == 0) notempty.await(); T x = items[head]; if (++head == items.length) head = 0; --count; notfull.signal(); return x; finally { lock.unlock(); 57 LockedQueue deq() Ανάλογα για το enq()

58 The lost wakeup problem Εμφανής βελτιστοποίηση στην υλοποίηση της προηγούμενης ουράς: Ειδοποίηση των νημάτων υπό αναμονή μόνο στις οριακές καταστάσεις (εισαγωγή 1 ου item στην ουρά, διαγραφή από πλήρη λίστα) Σε αυτή την περίπτωση μπορεί να υπάρξει η παρακάτω ακολουθία λειτουργιών σε άδεια ουρά: 1. Consumer A.deq() // κοιμάται 2. Consumer B.deq() // κοιμάται 3. Producer C.enq() // items == 1 4. Producer C.signal() 5. Consumer A: ξυπνά αλλά δεν προλαβαίνει να πάρει το lock 6. Producer D enq() // items = 2 (δεν κάνει signal γιατί δε βρήκε άδεια ουρά) 7. Consumer A: παίρνει το lock και καταναλώνει ένα αντικείμενο //items = 1 Λύση: Ο Consumer B δεν ξυπνά ποτέ παρόλο που υπάρχει αντικείμενο να καταναλώσει! Ενημερώνουμε (ξυπνάμε) όλα τα νήματα σε αναμονή (signalall) Ορίζουμε timeout στην αναμονή 58

59 Condition variables: Τρόπος λειτουργίας 59

60 Τακτικές συγχρονισμού για δομές δεδομένων (1) Coarse-grain synchronization Χρησιμοποιείται ένα κλείδωμα για όλη τη δομή Εύκολη υλοποίηση Περιορίζει την παράλληλη πρόσβαση των νημάτων στη δομή Fine-grain synchronization Χρησιμοποιούνται περισσότερα κλειδώματα σε τμήματα της δομής Εξασφαλίζεται παράλληλη πρόσβαση στη δομή από πολλαπλά νήματα Δύσκολη υλοποίηση Υψηλό κόστος κτήσης / απελευθέρωσης κλειδωμάτων Optimistic synchronization Για εισαγωγή/διαγραφή: αναζήτηση του στοιχείου χωρίς κλείδωμα Αν βρεθεί: χρησιμοποιείται κλείδωμα γίνεται έλεγχος αν το στοιχείο εξακολουθεί να είναι στη δομή πραγματοποιείται η επεξεργασία του στοιχείου Αναζήτηση: χρήση κλειδωμάτων

61 Τακτικές συγχρονισμού για δομές δεδομένων (2) Lazy synchronization Η διαδικασία διαιρείται σε 2 μέρη (ελαφρύ, βαρύ) Το ελαφρύ μέρος (π.χ. η λογική αφαίρεση ενός κόμβου μέσω της εγγραφής ενός tag) πραγματοποιείται αμέσως και με συγχρονισμό Το βαρύ μέρος (π.χ. η φυσική αφαίρεση ενός κόμβου διόρθωση των δεικτών) μπορεί να γίνει χωρίς συγχρονισμό αργότερα (lazy) Non-blocking synchronization Σε κάποιες περιπτώσεις μπορούμε να αποφύγουμε τα κλειδώματα Χρησιμοποιούνται οι ατομικές εντολές που παρέχει το υλικό (TAS, CAS) Transactional memory Προγραμματιστικό μοντέλο που υποστηρίζει ατομικές εκτελέσεις τμημάτων κώδικα (transactions) Τα transactions καταγράφονται Αν υπήρξε ταυτόχρονη πρόσβαση η εκτέλεση αναιρείται και επανεκκινείται Υλοποίηση σε λογισμικό (STM), υλικό (HTM) ή υβριδικά Επεξεργαστές: SUN Rock (canceled by Oracle), IBM BlueGene/Q, IBM zenterprise EC12, Intel Haswell/Broadwell, IBM Power

62 Σχήματα συγχρονισμού για συνδεδεμένες λίστες Δομή υπό εξέταση: Συνδεδεμένη λίστα με ταξινομημένα στοιχεία Κάθε κόμβος περιλαμβάνει: κλειδί - key (συνήθως hash key, ταξινομημένο) τιμή - value (τυπικά ένας δείκτης στο περιεχόμενο του κόμβου εδώ χρησιμοποιούμε έναν πραγματικό αριθμό για απλότητα) δείκτη στον επόμενο κόμβο Λειτουργίες: add (value), προστίθεται αν δεν υπάρχει remove (value), αφαιρείται αν υπάρχει contains (value), επιστρέφει true αν υπάρχει η τιμή, αλλιώς false Περιλαμβάνει 2 κόμβους φρουρούς για την αρχή και το τέλος με τη μέγιστη και ελάχιστη τιμή Η δομή μπορεί να εμπλουτιστεί / τροποποιηθεί προκειμένου να υποστηρίξει κάποιο σχήμα συγχρονισμού

63 Συνδεδεμένες λίστες (λεπτομέρειες υλοποίησης) κλειδί key (ταξινομημένο) δείκτης - next στον επόμενο κόμβο τιμή value Κόμβοι φρουροί (sentinel nodes) με ελάχιστη και μέγιστη τιμή κλειδιού 63

64 Συνδεδεμένες λίστες (λεπτομέρειες υλοποίησης) public class Node { public T value; public int key; public Node next; 64

65 Συνδεδεμένες λίστες (προσθήκη στοιχείου)

66 Συνδεδεμένες λίστες (προσθήκη στοιχείου)

67 Συνδεδεμένες λίστες (αφαίρεση στοιχείου)

68 Συνδεδεμένες λίστες (αφαίρεση στοιχείου)

69 Coarse-grain synchronization Ένα κλείδωμα για όλη τη δομή 69

70 public class CoarseList<T> { private Node head; private Node tail; private Lock lock = new ReentrantLock(); Coarse-grain synchronization public CoarseList() { head = new Node(Integer.MIN_VALUE); tail = new Node(Integer.MAX_VALUE); head.next = this.tail; 70

71 public class CoarseList<T> { public boolean add(t item) { Node pred, curr; int key = item.hashcode(); lock.lock(); try { pred = head; curr = pred.next; while (curr.key < key) { pred = curr; curr = curr.next; if (key == curr.key) { return false; else { Node node = new Node(item); node.next = curr; pred.next = node; return true; finally { lock.unlock(); 71 Coarse-grain synchronization: add

72 public class CoarseList<T> { public boolean add(t item) { Node pred, curr; int key = item.hashcode(); lock.lock(); try { pred = head; curr = pred.next; while (curr.key < key) { pred = curr; curr = curr.next; if (key == curr.key) { return false; else { Node node = new Node(item); node.next = curr; pred.next = node; return true; finally { lock.unlock(); 72 Coarse-grain synchronization: add Ολόκληρη η εκτέλεση της μεθόδου περιλαμβάνεται σε ένα κρίσιμο τμήμα

73 public class CoarseList<T> { public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); lock.lock(); try { pred = this.head; curr = pred.next; while (curr.key < key) { pred = curr; curr = curr.next; if (key == curr.key) { pred.next = curr.next; return true; else { return false; finally { lock.unlock(); Coarse-grain synchronization: remove Ολόκληρη η εκτέλεση της μεθόδου περιλαμβάνεται σε ένα κρίσιμο τμήμα Ομοίως και για τη μέθοδο contains 73

74 Fine-grain synchronization Γιατί να κλειδώνουμε ολόκληρη τη δομή αν τα νήματα εργάζονται σε πλήρως ανεξάρτητα τμήματά της; Ιδέα: να χρησιμοποιήσουμε πολλαπλά κλειδώματα Τι ακριβώς πρέπει να κλειδώσουμε; 74

75 Fine-grain synchronization Πολλαπλά κλειδώματα για τη δομή 75

76 Αρκεί ένα κλείδωμα ανά κόμβο; Fine-grain synchronization Έστω ότι το νήμα Α θέλει να διαγράψει το 1 και το νήμα Β θέλει να διαγράψει το

77 Fine-grain synchronization Αρκεί ένα κλείδωμα ανά κόμβο; Νήμα Α

78 Fine-grain synchronization Αρκεί ένα κλείδωμα ανά κόμβο; Νήμα Α Νήμα Β

79 Fine-grain synchronization Αρκεί ένα κλείδωμα ανά κόμβο; Νήμα Α Νήμα Β

80 Fine-grain synchronization Αρκεί ένα κλείδωμα ανά κόμβο; Νήμα Α Νήμα Β Η δομή δεν είναι συνεπής! 80

81 Fine-grain synchronization Αρκεί ένα κλείδωμα ανά κόμβο; ΟΧΙ 81

82 Fine-grain synchronization Λύση: αν ένας κόμβος είναι κλειδωμένος, κανείς δεν πρέπει να αφαιρεί τον επόμενό του Το νήμα μπορεί να κλειδώνει τον προς αφαίρεση κόμβο και τον προηγούμενό του hand-over-hand locking 82

83 Λύση: hand-over-hand locking Fine-grain synchronization Έστω ότι το νήμα Α θέλει να διαγράψει το 1 και το νήμα Β θέλει να διαγράψει το 4 Νήμα Α Νήμα Β

84 Λύση: hand-over-hand locking Fine-grain synchronization Έστω ότι το νήμα Α θέλει να διαγράψει το 1 και το νήμα Β θέλει να διαγράψει το 4 Νήμα Α Νήμα Β Μόνο ένα από τα νήματα θα πάρει το κλείδωμα για τον κόμβο 1 84

85 Fine-grain synchronization Διάσχιση λίστας

86 Fine-grain synchronization Διάσχιση λίστας

87 Fine-grain synchronization Διάσχιση λίστας

88 Fine-grain synchronization Διάσχιση λίστας

89 Fine-grain synchronization Διάσχιση λίστας

90 Fine-grain synchronization Διάσχιση λίστας

91 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove 91

92 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove Κλείδωμα της κεφαλής της λίστας 92

93 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove Πρόσβαση στην κεφαλή Πρόσβαση στο 2 ο στοιχείο Κλείδωμα 2 ου στοιχείου 93

94 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove Διασχίζεται η λίστα με hand-overhand locking 94

95 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove Διαγραφή στοιχείου ΣΗΜΕΙΩΣΗ: Στη συγκεκριμένη περίπτωση η φυσική διαγραφή του κόμβου πραγματοποιείται από το μηχανισμό garbage collection της γλώσσας 95

96 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove Απελευθέρωση κλειδωμάτων 96

97 public boolean remove(t item) { Node pred, curr; int key = item.hashcode(); head.lock(); try { pred = head; curr = pred.next; curr.lock(); try { while (curr.key < key) { pred.unlock(); pred = curr; curr = curr.next; curr.lock(); if (curr.key == key) { pred.next = cur.next; return true; return false; finally { curr.unlock(); finally { pred.unlock(); Fine-grain synchronization: remove Παρόμοια λογική για τις μεθόδους add και contains 97

98 Fine-grain synchronization Όλες οι μέθοδοι πρέπει να καταλαμβάνουν τα locks με την ίδια σειρά για να αποφευχθεί αδιέξοδο Έστω ότι το νήμα Α θέλει να προσθέσει το 2 και το νήμα Β να διαγράψει το 4 και το νήμα Α καταλαμβάνει locks από δεξιά προς τα αριστερά ενώ το νήμα Β από δεξιά προς τα αριστερά Νήμα Β Νήμα Α

99 Fine-grain synchronization Όλες οι μέθοδοι πρέπει να καταλαμβάνουν τα locks με την ίδια σειρά για να αποφευχθεί αδιέξοδο Έστω ότι το νήμα Α θέλει να προσθέσει το 2 και το νήμα Β να διαγράψει το 4 και το νήμα Α καταλαμβάνει locks από δεξιά προς τα αριστερά ενώ το νήμα Β από δεξιά προς τα αριστερά Νήμα Β Νήμα Α Αδιέξοδο: το ένα νήμα περιμένει να πάρει το lock που κρατά το άλλο 99

100 Optimistic synchronization O fine-grain συγχρονισμός αποτελεί βελτίωση σε σχέση με τον coarse-grain Παρόλα αυτά περιλαμβάνει μια μεγάλη σειρά από λήψεις και απελευθερώσεις κλειδωμάτων Νήματα που προσπελαύνουν διακριτά μέρη της λίστας μπορεί να αδυνατούν να εργαστούν ταυτόχρονα (π.χ. ένα νήμα που προσπελαύνει ένα στοιχείο στην αρχή της λίστας, εμποδίζει άλλα στοιχεία που θέλουν να προσπελάσουν τη μέση ή το τέλος της λίστας) Ας σκεφτούμε «αισιόδοξα», δηλαδή τα πράγματα έχουν λίγες πιθανότητες να πάνε στραβά: Εισαγωγή/διαγραφή: αναζήτηση του στοιχείου χωρίς κλείδωμα Κλείδωμα των κατάλληλων κόμβων Έλεγχος αν η δομή παραμένει συνεπής Αν όχι απελευθέρωση των κλειδωμάτων και νέα προσπάθεια Αναζήτηση στοιχείου (μέθοδος contains) με κλείδωμα 100

101 Optimistic synchronization: validate Ελέγχει αν η δομή είναι συνεπής, δηλαδή: Αν ο προηγούμενος κόμβος (pred) είναι προσβάσιμος από την αρχή της δομής, και Αν ο επόμενος του προηγούμενου είναι ο τρέχοντας (pred.next == curr) 101

102 Optimistic synchronization: validate private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; 102

103 Optimistic synchronization: validate private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Πρόσβαση στον προηγούμενο κόμβο από την αρχή της δομής 103

104 Optimistic synchronization: validate private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Έλεγχος αν το προηγούμενο δείχνει στο τρέχον 104

105 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove 105

106 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Επαναληπτική προσπάθεια μέχρι να επιτύχει 106

107 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Διάσχιση της λίστας χωρίς κλειδώματα 107

108 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Κλειδώνει τον προηγούμενο και τον τρέχοντα 108

109 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Αν η δομή είναι συνεπής 109

110 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Αν η δομή είναι συνεπής, και υπάρχει το στοιχείο το αφαιρεί και επιστρέφει 110

111 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Αν η δομή είναι συνεπής, και δεν υπάρχει το στοιχείο, επιστρέφει 111

112 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Αν η δομή ΔΕΝ είναι συνεπής, ξεκλειδώνει 112

113 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Αν η δομή ΔΕΝ είναι συνεπής, ξεκλειδώνει, και ξαναπροσπαθεί 113

114 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Optimistic synchronization: remove Ανάλογα λειτουργεί η add Η contains χρησιμοποιεί κλειδώματα 114

115 Lazy synchronization O optimistic συγχρονισμός λειτουργεί καλύτερα από το fine-grain συγχρονισμό αν: το κόστος να διατρέξουμε τη δομή 2 φορές χωρίς κλειδώματα είναι χαμηλότερο από το να την διατρέξουμε μία φορά με κλειδώματα Μειονέκτημα: η μέθοδος contains χρησιμοποιεί κλειδώματα Θέλουμε να το αποφύγουμε δεδομένου ότι αναμένουμε η contains να καλείται με πολύ μεγάλη συχνότητα Επόμενο βήμα βελτιστοποίησης: Η add και remove να διατρέχουν τη λίστα μία φορά (όταν δεν υπάρχει συμφόρηση) Η contains να μη χρησιμοποιεί καθόλου κλειδώματα (wait-free) 115

116 Lazy synchronization Lazy synchronization: Προσθέτουμε στη δομή μία boolean μεταβλητή που δείχνει αν ο κόμβος βρίσκεται στη λίστα ή έχει διαγραφεί Η contains διατρέχει τη λίστα χωρίς να κλειδώνει Η add διατρέχει τη λίστα, κλειδώνει και ελέγχει τη συνέπεια της δομής καλώντας τη validate H validate δεν διατρέχει τη λίστα από την αρχή αλλά κάνει ελέγχους στους κόμβους pred και curr Η remove είναι lazy, δηλαδή λειτουργεί σε 2 βήματα: Το 1 ο βήμα αφαιρεί λογικά τον κόμβο (θέτοντας τη boolean μεταβλητή σε false) To 2 ο βήμα αφαιρεί φυσικά τον κόμβο επαναθέτοντας του δείκτες 116

117 Lazy synchronization

118 Lazy synchronization Boolean μεταβλητή που δείχνει αν ο κόμβος είναι στη δομή 118

119 Lazy synchronization: remove remove(4)

120 Lazy synchronization: remove remove(4)

121 Lazy synchronization: remove remove(4) λογική αφαίρεση 121

122 Lazy synchronization: remove remove(4) φυσική αφαίρεση 122

123 Lazy synchronization: validate private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr; 123

124 Lazy synchronization: validate private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr; Δεν έχει σβηστεί ο προηγούμενος 124

125 Lazy synchronization: validate private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr; Δεν έχει σβηστεί ο τρέχων 125

126 Lazy synchronization: validate private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr; Ο προηγούμενος δείχνει τον τρέχοντα 126

127 Lazy synchronization: contains public boolean contains(t item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; Δεν χρησιμοποιεί κανένα κλείδωμα 127

128 Lazy synchronization: contains public boolean contains(t item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; Ελέγχει αν ο κόμβος έχει σβηστεί λογικά 128

129 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove 129

130 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove Αναζήτηση χωρίς κλείδωμα 130

131 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove Τοπικό κλείδωμα 131

132 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove Διαγραφή σε 2 βήματα: 132

133 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove Διαγραφή σε 2 βήματα: 1 ο Βήμα: Λογική διαγραφή 133

134 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove Διαγραφή σε 2 βήματα: 1 ο Βήμα: Λογική διαγραφή 2 ο Βήμα: Φυσική διαγραφή 134

135 public boolean remove(item item) { int key = item.hashcode(); while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; pred.lock(); curr.lock(); try { if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Lazy synchronization: remove Ομοίως η Add 135

136 Non-blocking synchronization Τελευταίο βήμα: Να απαλείψουμε πλήρως τα κλειδώματα και από τις 3 μεθόδους της δομής, add(), remove και contains(). Γιατί μας ενδιαφέρει να απαλείψουμε πλήρως τα κλειδώματα; Επίδοση: Υπό συνθήκες μπορεί να είναι ταχύτερο Ανθεκτικότητα (robustness): Αποφεύγουμε καταστάσεις κατά τις οποίες η αποτυχία ενός νήματος που κρατάει ένα κλείδωμα θα οδηγήσει σε αποτυχία όλης της εφαρμογής Ιδέα: Να χειριστούμε τα πεδία marked και next της δομής σαν μία ατομική μονάδα Οποιαδήποτε προσπάθεια ενημέρωσης του πεδίου next όταν το marked είναι true θα αποτύχει 136

137 Non-blocking synchronization: Ζητήματα υλοποίησης address marked field Η δομή ως τώρα 137

138 Non-blocking synchronization: Ζητήματα υλοποίησης Συμπυκνώνονται τα δύο κρίσιμα πεδία της δομής σε μία packed μορφή την οποία ο επεξεργαστής μπορεί να χειριστεί ατομικά address marked bit Π.χ. AtomicMarkableReference class Java.util.concurrent.atomic package 138

139 public T get(boolean[] marked); public boolean compareandset( T expectedref, T updateref, boolean expectedmark, boolean updatemark); public boolean attemptmark( T expectedref, boolean updatemark); AtomicMarkableReference 139

140 public T get(boolean[] marked); AtomicMarkableReference public Επιστρέφει boolean τη διεύθυνση compareandset( του αντικειμένου T και αποθηκεύει το mark T expectedref, στη θέση 0 του πίνακα που περνιέται σαν παράμετρος T updateref, boolean expectedmark, boolean updatemark); public boolean attemptmark( T expectedref, boolean updatemark); 140

141 public T get(boolean[] marked); public boolean compareandset( T expectedref, T updateref, boolean expectedmark, boolean updatemark); AtomicMarkableReference Ελέγχει public και boolean αν επιτύχει attemptmark( ενημερώνει ΚΑΙ τα δύο πεδία T expectedref, boolean updatemark); 141

142 public T get(boolean[] marked); public boolean compareandset( T expectedref, T updateref, boolean expectedmark, boolean updatemark); public boolean attemptmark( T expectedref, boolean updatemark); AtomicMarkableReference Ενημέρωνει το mark αν η διεύθυνση είναι η αναμενόμενη 142

143 Non-blocking synchronization Τελευταίο βήμα: Να απαλείψουμε πλήρως τα κλειδώματα και από τις 3 μεθόδους της δομής, add(), remove και contains(). Ιδέα: Να χειριστούμε τα πεδία marked και next της δομής σαν μία ατομική μονάδα Οποιαδήποτε προσπάθεια ενημέρωσης του πεδίου next όταν το marked είναι true (ο κόμβος δεν υπάρχει) θα αποτύχει Η αφαίρεση ενός κλειδιού περιλαμβάνει την ενημέρωση του πεδίου marked (και μία μόνο απόπειρα να ενημερωθούν οι διευθύνσεις) Κάθε νήμα που διατρέχει τη λίστα εκτελώντας την add() και remove() αφαιρεί φυσικά τους κόμβους που συναντά να έχουν σβηστεί Η αποτυχία για ατομική ενημέρωση οδηγεί στην επαναπροσπάθεια με διάτρεξη από την αρχή της λίστας 143

144 Non-blocking synchronization: βοηθητική κλάση Window και μέθοδος find() Χρησιμοποιείται από την add() και τη remove() για να βρεθεί το σημείο που θα γίνει η εισαγωγή ή το στοιχείο που θα αφαιρεθεί Επιστρέφει ένα δείκτη στο ακριβώς μικρότερο στοιχείο (από αυτό που θα προστεθεί ή αφαιρεθεί) και ένα δείκτη στο αμέσως μεγαλύτερο ή ίσο στοιχείο Αν συναντήσει στοιχεία που έχουν σβηστεί λογικά τα σβήνει και φυσικά 144

145 public Window find(node head, int key) { Node pred = null, curr = null succ = null; boolean[] marked = {false; retry: while (true) { 145 pred = head; curr = pred.next.getreference(); while (true) succ = curr.next.get(marked); while (marked[0]) { snip = pred.next.compareandset(curr, succ, false, false); if (!snip) continue retry; curr = succ; succ = curr.next.get(marked); if (curr.key >= key) return new Window(pred,curr); pred = curr; curr = succ; Non-blocking synchronization: find()

146 public Window find(node head, int key) { Node pred = null, curr = null succ = null; boolean[] marked = {false; retry: while (true) { 146 pred = head; curr = pred.next.getreference(); while (true) { succ = curr.next.get(marked); while (marked[0]) { snip = pred.next.compareandset(curr, succ, false, false); if (!snip) continue retry; curr = succ; succ = curr.next.get(marked); if (curr.key >= key) return new Window(pred, curr); pred = curr; curr = succ; Non-blocking synchronization: find() Διατρέχει τη λίστα μέχρι να βρει ένα στοιχείο μεγαλύτερο από το ζητούμενο

147 public Window find(node head, int key) { Node pred = null, curr = null succ = null; boolean[] marked = {false; retry: while (true) { 147 pred = head; curr = pred.next.getreference(); while (true) succ = curr.next.get(marked); while (marked[0]) { snip = pred.next.compareandset(curr, succ, false, false); if (!snip) continue retry; curr = succ; succ = curr.next.get(marked); if (curr.key >= key) return new Window(pred,curr); pred = curr; curr = succ; Non-blocking synchronization: find() Αν βρεθεί στοιχείο που έχει σβηστεί λογικά, σβήνεται και φυσικά

148 public Window find(node head, int key) { Node pred = null, curr = null succ = null; boolean[] marked = {false; retry: while (true) { 148 pred = head; curr = pred.next.getreference(); while (true) succ = curr.next.get(marked); while (marked[0]) { snip = pred.next.compareandset(curr, succ, false, false); if (!snip) continue retry; curr = succ; succ = curr.next.get(marked); if (curr.key >= key) return new Window(pred,curr); pred = curr; curr = succ; Non-blocking synchronization: find() Αν αποτύχει η ατομική ενημέρωση η διαδικασία ξεκινά από την αρχή

149 public boolean remove(t item) { boolean snip; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key!= key) { return false; else { Node succ = curr.next.getreference(); snip = curr.next.attemptmark(succ, true); if (!snip) continue; pred.next.compareandset(curr, succ, false, false); return true; Non-blocking synchronization: remove() 149

150 public boolean remove(t item) { boolean snip; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key!= key) { return false; else { Node succ = curr.next.getreference(); snip = curr.next.attemptmark(succ, true); if (!snip) continue; pred.next.compareandset(curr, succ, false, false); return true; Non-blocking synchronization: remove() Αφαιρεί λογικά τον κόμβο 150

151 public boolean remove(t item) { boolean snip; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key!= key) { return false; else { Node succ = curr.next.getreference(); snip = curr.next.attemptmark(succ, true); if (!snip) continue; pred.next.compareandset(curr, succ, false, false); return true; Non-blocking synchronization: remove() Αφαιρεί λογικά τον κόμβο. Αν αποτύχει (γιατί η κόμβος έχει εντωμεταξύ αφαιρεθεί και φυσικά) ξαναξεκινά (ο 151

152 public boolean remove(t item) { boolean snip; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key!= key) { return false; else { Node succ = curr.next.getreference(); snip = curr.next.attemptmark(succ, true); if (!snip) continue; pred.next.compareandset(curr, succ, false, false); return true; Non-blocking synchronization: remove() Κάνει μία απόπειρα να αφαιρέσει και φυσικά τον κόμβο 152

153 public boolean add(t item) { boolean splice; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key == key) { return false; else { Node node = new Node(item); node.next = new AtomicMarkableRef(curr, false); if (pred.next.compareandset(curr, node, false, false)) return true; Non-blocking synchronization: add() 153

154 public boolean add(t item) { boolean splice; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key == key) { return false; else { Node node = new Node(item); node.next = new AtomicMarkableRef(curr, false); if (pred.next.compareandset(curr, node, false, false)) return true; Non-blocking synchronization: add() Δημιουργία και αρχικοποίηση νέου κόμβου 154

155 public boolean add(t item) { boolean splice; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key == key) { return false; else { Node node = new Node(item); node.next = new AtomicMarkableRef(curr, false); if (pred.next.compareandset(curr, node, false, false)) return true; Non-blocking synchronization: add() Διασύνδεση νέου κόμβου στη δομή 155

156 public boolean add(t item) { boolean splice; while (true) { Window window = find(head, key); Node pred = window.pred, curr = window.curr; if (curr.key == key) { return false; else { Node node = new Node(item); node.next = new AtomicMarkableRef(curr, false); if (pred.next.compareandset(curr, node, false, false)) return true; Non-blocking synchronization: add() Αν αποτύχει, ξαναπροσπαθεί 156

157 public boolean contains(tt item) { boolean marked; int key = item.hashcode(); Node curr = this.head; while (curr.key < key) curr = curr.next; Node succ = curr.next.get(marked); return (curr.key == key &&!marked[0]) Non-blocking synchronization: contains() Wait-free μέθοδος 157

158 Ιδιότητες προόδου στα σχήματα Blocking και Non-blocking Κάποιος προοδεύει Όλοι προοδεύουν Blocking Χωρίς αδιέξοδο (deadlock-free) Χωρίς λιμοκτονία (starvation-free) Non-blocking Lock-free Wait-free 158

159 Σύνοψη contains insert delete validate Coarse-grain 1 lock 1 lock 1 lock no Fine-grain Optimistic hand-over-hand locking hand-over-hand locking hand-over-hand locking hand-over-hand locking no local locking local locking διάσχιση από την αρχή Lazy no locking local locking local locking local checks Non-blocking wait-free lock-free (has retries) lock-free (has retries) no 159

160 Further reading Chapters 7, 8, 9 from: The Art of Multiprocessor Programming By Maurice Herlihy, Nir Shavit The following joke circulated in Italy in the 1920s. According to Mussolini, the ideal citizen is intelligent, honest, and Fascist. Unfortunately, no one is perfect, which explains why everyone you meet is either intelligent and Fascist but not honest, honest and Fascist but not intelligent, or honest and intelligent but not Fascist. 160

Συγχρονισμός. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

Συγχρονισμός. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Συγχρονισμός 9 ο Εξάμηνο Σύνοψη Το πρόβλημα του συγχρονισμού Βασικοί μηχανισμοί Κλειδώματα

Διαβάστε περισσότερα

Συγχρονισμός. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων

Συγχρονισμός. Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Συγχρονισμός 9 ο Εξάμηνο Σύνοψη Το πρόβλημα του συγχρονισμού Βασικοί μηχανισμοί Κλειδώματα

Διαβάστε περισσότερα

Συγχρονισμός Μέρος Α : Κρίσιμο τμήμα και κλειδώματα

Συγχρονισμός Μέρος Α : Κρίσιμο τμήμα και κλειδώματα Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Συγχρονισμός Μέρος Α : Κρίσιμο τμήμα και κλειδώματα 9 ο Εξάμηνο Η ανάγκη για συγχρονισμό

Διαβάστε περισσότερα

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi Προϋποθέσεις για Αµοιβαίο Αποκλεισµό Μόνο µία διεργασία σε κρίσιµο τµήµασεκοινό πόρο Μία διεργασία που σταµατά σε µη κρίσιµο σηµείο δεν πρέπει να επιρεάζει τις υπόλοιπες διεργασίες εν πρέπει να υπάρχει

Διαβάστε περισσότερα

Παρουσίαση 5 ης Άσκησης:

Παρουσίαση 5 ης Άσκησης: Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Παρουσίαση 5 ης Άσκησης: Θέματα Συγχρονισμού σε Σύγχρονα Πολυπύρηνα Συστήματα Ακ. Έτος

Διαβάστε περισσότερα

Λειτουργικά Συστήματα Η/Υ

Λειτουργικά Συστήματα Η/Υ Λειτουργικά Συστήματα Η/Υ Κεφάλαιο 5 «Αμοιβαίος Αποκλεισμός» Διδάσκων: Δ Λιαροκάπης Διαφάνειες: Π. Χατζηδούκας 1 Αμοιβαίος Αποκλεισμός 1. Εισαγωγή 2. Κρίσιμα τμήματα (Critical Sections) 3. Υλοποίηση του

Διαβάστε περισσότερα

Παρουσίαση 5 ης Άσκησης:

Παρουσίαση 5 ης Άσκησης: Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων Παρουσίαση 5 ης Άσκησης: Θέματα Συγχρονισμού σε Σύγχρονα Πολυπύρηνα Συστήματα Ακ. Έτος

Διαβάστε περισσότερα

Διεργασίες (Processes)

Διεργασίες (Processes) Διεργασία (process) ή καθήκον (task) Διεργασίες (Processes) στοιχειώδης οντότητα/δραστηριότητα υπολογισμού (processing entity/activity) εκτέλεση ενός προγράμματος ένα (κύριο) νήμα (thread)/ρεύμα ελέγχου/εκτέλεσης

Διαβάστε περισσότερα

Συλλογές, Στοίβες και Ουρές

Συλλογές, Στοίβες και Ουρές Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (bag) : Επιστρέφει

Διαβάστε περισσότερα

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1 Αμοιβαίος αποκλεισμός με κοινή μνήμη 1 lalis@inf.uth.gr Το πρόβλημα Έστω ότι δύο η περισσότερα νήματα επιθυμούν να προσπελάσουν έναν κοινό πόρο, που όμως δεν μπορεί να χρησιμοποιηθεί ταυτόχρονα Η χρήση

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Συγχρονισμός (συνέχεια) Μεταβλητές υπό συνθήκη Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group Συγχρονισμός μεταξύ νημάτων

Διαβάστε περισσότερα

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο 2017-2018 Πρώτη Προγραμματιστική Εργασία Προθεσμία παράδοσης: Δευτέρα 30/4 στις 23:59. 1. Γενική Περιγραφή Στην πρώτη προγραμματιστική εργασία καλείστε

Διαβάστε περισσότερα

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα ΙΙΙ 1 lalis@inf.uth.gr Προβλήματα με κλείδωμα Υπερβολική σειριοποίηση / άσκοπη αναμονή Κόστος συγχρονισμού Αδιέξοδα Απότομος τερματισμός νημάτων

Διαβάστε περισσότερα

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα

Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα Προσπέλαση σύνθετων δομών δεδομένων χωρίς καθολικό κλείδωμα ΙΙΙ 1 lalis@inf.uth.gr Προβλήματα με κλείδωμα Υπερβολική σειριοποίηση / άσκοπη αναμονή Κόστος συγχρονισμού Αδιέξοδα Απότομος τερματισμός νημάτων

Διαβάστε περισσότερα

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα 1 Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου Λειτουργικά Συστήματα Ενότητα 5 : Αμοιβαίος Αποκλεισμός Δημήτριος Λιαροκάπης 2 Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου Τμήμα Μηχανικών

Διαβάστε περισσότερα

Υ- 07 Παράλληλα Συστήματα Transac9onal memory

Υ- 07 Παράλληλα Συστήματα Transac9onal memory Υ- 07 Παράλληλα Συστήματα Transac9onal memory Αρης Ευθυμίου Παρ. προγρ/μός με κλειδιά Χαμηλού επιπέδου πολύ κοντά στα μέσα και τις δομές του υλικού πολλές λεπτομέρειες, εύκολα γίνεται λάθος χαμηλή παραγωγικότητα

Διαβάστε περισσότερα

HY-486 Αρχές Κατανεμημένου Υπολογισμού

HY-486 Αρχές Κατανεμημένου Υπολογισμού HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο 2016-2017 Πρώτη Προγραμματιστική Εργασία Προθεσμία παράδοσης: Τρίτη 2/5 στις 23:59. 1. Γενική Περιγραφή Στην πρώτη προγραμματιστική εργασία καλείστε

Διαβάστε περισσότερα

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1 Ελεγκτές/Παρακολουθητές (Monitors) 1 lalis@inf.uth.gr Ελεγκτές Αμοιβαίος αποκλεισμός στο πλαίσιο ενός τμήματος λογισμικού που προσπελάζεται με δομημένο τρόπο, μέσω προκαθορισμένης διασύνδεσης (API) Ο συγχρονισμός

Διαβάστε περισσότερα

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1 Αμοιβαίος αποκλεισμός με κοινή μνήμη 1 lalis@inf.uth.gr Το πρόβλημα Έστω ότι δύο η περισσότερα νήματα επιθυμούν να προσπελάσουν έναν κοινό πόρο, που όμως δεν μπορεί να χρησιμοποιηθεί ταυτόχρονα Η χρήση

Διαβάστε περισσότερα

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1

Ελεγκτές/Παρακολουθητές (Monitors) Ταυτόχρονος Προγραμματισμός 1 Ελεγκτές/Παρακολουθητές (Monitors) 1 lalis@inf.uth.gr Ελεγκτές Αμοιβαίος αποκλεισμός στο πλαίσιο ενός τμήματος λογισμικού που προσπελάζεται με δομημένο τρόπο, μέσω προκαθορισμένης διασύνδεσης (API) Ο συγχρονισμός

Διαβάστε περισσότερα

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΧΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Λειτουργικά Συστήματα Ενότητα 4α: Σημαφόροι, Πρόβλημα Συνδαιτυμόνων Φιλοσόφων, Αδιέξοδα Αθηνά Βακάλη Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Μηχανισμοί και προγραμματιστικές δομές συγχρονισμού. Προβλήματα συγχρονισμού (και λύσεις)

Μηχανισμοί και προγραμματιστικές δομές συγχρονισμού. Προβλήματα συγχρονισμού (και λύσεις) Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς. Περιεχόμενα

Διαβάστε περισσότερα

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1 Σηματοφόροι (Σηματοφορείς) 1 lalis@inf.uth.gr Αποφυγή ενεργής αναμονής if () { WAIT(); Μπορεί να γίνει εναλλαγή αφού το νήμα κάνει τον έλεγχο της συνθήκης αναμονής και την βρει αληθή, αλλά προτού αυτό

Διαβάστε περισσότερα

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1

Αμοιβαίος αποκλεισμός με κοινή μνήμη. Ταυτόχρονος Προγραμματισμός 1 Αμοιβαίος αποκλεισμός με κοινή μνήμη 1 lalis@inf.uth.gr Το πρόβλημα Έστω ότι δύο η περισσότερα νήματα επιθυμούν να προσπελάσουν έναν κοινό πόρο, που όμως δεν μπορεί να χρησιμοποιηθεί ταυτόχρονα Η χρήση

Διαβάστε περισσότερα

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 12: Δέντρα ΙΙ -Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης(ΔΔΑ) - Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου - Εισαγωγή

Διαβάστε περισσότερα

Εισαγωγή στα Λειτουργικά Συστήματα

Εισαγωγή στα Λειτουργικά Συστήματα Εισαγωγή στα Λειτουργικά Συστήματα Ενότητα 4: Διεργασίες ΙΙ Γεώργιος Φ. Φραγκούλης Τμήμα Ηλεκτρολόγων Μηχανικών Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για

Διαβάστε περισσότερα

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων 3 η Εργαστηριακή Άσκηση: Συγχρονισμός Λειτουργικά Συστήματα Υπολογιστών 7ο Εξάμηνο, 2016-2017

Διαβάστε περισσότερα

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ευθύγραμμες Απλά Συνδεδεμένες Λίστες (εισαγωγή, εύρεση, διαγραφή) Ευθύγραμμες Διπλά Συνδεδεμένες Λίστες

Διαβάστε περισσότερα

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων. Συγχρονισμός Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχ. και Μηχανικών Υπολογιστών Εργαστήριο Υπολογιστικών Συστημάτων 3 η Εργαστηριακή Άσκηση: Συγχρονισμός Λειτουργικά Συστήματα Υπολογιστών 7ο Εξάμηνο, 2017-2018

Διαβάστε περισσότερα

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) ΙΙΙ 1 lalis@inf.uth.gr Ταυτόχρονη εκτέλεση Ο προγραμματιστής δεν ελέγχει (άμεσα) την εκτέλεση/εναλλαγή των νημάτων Δεν γνωρίζει πότε θα αρχίσει

Διαβάστε περισσότερα

Λειτουργικά Συστήματα (ΗΥ222)

Λειτουργικά Συστήματα (ΗΥ222) Λειτουργικά Συστήματα (ΗΥ222) Ταυτοχρονισμός, Συγχρονισμός Πολλαπλές Διεργασίες/Νήματα σε 1 Κοινωνία: Προβλήματα; «Κοινωνικές Γιάννης διεργασίες/νήματα»: Διαβάζουν/γράφουν στον ίδιο χώρο. Αποτέλεσμα; Πιθανότατα

Διαβάστε περισσότερα

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

Διαβάστε περισσότερα

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 22: Συγχρονισμός (Concurrency) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Διεργασίες (processes) και Νήματα (threads) - Συγχρονισμός Νημάτων, Προβλήματα, Λύσεις - Οι τροποποιητές

Διαβάστε περισσότερα

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

Διάλεξη Εισαγωγή στη Java, Μέρος Γ Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού για Δίκτυα και Τηλεπικοινωνίες Χειμερινό Εξάμηνο 2017-2018 Διάλεξη Εισαγωγή στη Java, Μέρος Γ Νήματα (Threads) στην Java Συγχρονισμός Producer-Consumer

Διαβάστε περισσότερα

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης (ΔΔΑ) Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου Εισαγωγή στοιχείου

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 9. Ταυτόχρονος προγραμματισμός και νήματα. 9.1 Εισαγωγή

ΚΕΦΑΛΑΙΟ 9. Ταυτόχρονος προγραμματισμός και νήματα. 9.1 Εισαγωγή ΚΕΦΑΛΑΙΟ 9 Ταυτόχρονος προγραμματισμός και νήματα Σύνοψη Σε αυτό το κεφάλαιο πραγματευόμαστε τον ταυτόχρονο προγραμματισμό με τη χρήση νημάτων. Η έμφαση είναι στην κατανόηση βασικών λειτουργιών των νημάτων

Διαβάστε περισσότερα

Ιδιοκτησία Αντικειµένου

Ιδιοκτησία Αντικειµένου Software Transactional Memory H STM υποστηρίζει την εκτέλεση δοσοληψιών από τις διεργασίες, οι οποίες περιέχουν λειτουργίες που ο χρήστης θέλει να εκτελέσει στα διαµοιραζόµενα αντικείµενα. H STM εγγυάται

Διαβάστε περισσότερα

Στοιχειώδεις Δομές Δεδομένων

Στοιχειώδεις Δομές Δεδομένων Στοιχειώδεις Δομές Δεδομένων Τύποι δεδομένων στη Java Ακέραιοι (int, long) Αριθμοί κινητής υποδιαστολής (float, double) Χαρακτήρες (char) Δυαδικοί (boolean) Από τους παραπάνω μπορούμε να φτιάξουμε σύνθετους

Διαβάστε περισσότερα

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1 Σηματοφόροι (Σηματοφορείς) 1 lalis@inf.uth.gr Αποφυγή ενεργής αναμονής εναλλαγή if/while () { WAIT(); Μπορεί να γίνει εναλλαγή αφού το νήμα κάνει τον έλεγχο της συνθήκης αναμονής και την βρει αληθή, αλλά

Διαβάστε περισσότερα

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t)

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t) Εργαστήριο 14 Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t) Να γράψετε πρόγραμμα που να δημιουργεί 1 νήμα Έτσι στο πρόγραμμα σας θα υπάρχουν 2 νήματα (το ένα νήμα είναι το αρχικό νήμα που

Διαβάστε περισσότερα

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα. http://aetos.it.teithe.gr/~demos/teaching_gr.

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα. http://aetos.it.teithe.gr/~demos/teaching_gr. Δομές Δεδομένων & Ανάλυση Αλγορίθμων 3ο Εξάμηνο Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα http://aetos.it.teithe.gr/~demos/teaching_gr.html Δημοσθένης Σταμάτης Τμήμα Μηχανικών Πληροφορικής ATEI ΘΕΣΣΑΛΟΝΙΚΗΣ

Διαβάστε περισσότερα

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Κυκλικές Απλά Συνδεδεμένες Λίστες - Κυκλικές Διπλά Συνδεδεμένες

Διαβάστε περισσότερα

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1 Νήµαταστην Java Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων Κατανεµηµένα Συστήµατα 11-1 Νήµαταστην Java γεννηθείσα notify notifyall έτοιµη start εκπνοή

Διαβάστε περισσότερα

Επικοινωνία µεταξύ ιεργασιών και Σύνδροµες ιεργασίες

Επικοινωνία µεταξύ ιεργασιών και Σύνδροµες ιεργασίες Επικοινωνία µεταξύ ιεργασιών και Σύνδροµες ιεργασίες Interprocess Communication and Concurrent Processes Περίληψη Σύνδροµος Προγραµµατισµός Συνθήκη συναγωνισµού Συγχρονισµός διεργασιών Κρίσιµες περιοχές

Διαβάστε περισσότερα

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό

Διαβάστε περισσότερα

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 22: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης - Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Νήματα & Συγχρονισμός Μεταβλητές κλειδιά Φράγματα Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group Συγχρονισμός μεταξύ νημάτων

Διαβάστε περισσότερα

ΣυγχρονισµόςσεΣυστήµατα ΠολλαπλώνΝηµάτων

ΣυγχρονισµόςσεΣυστήµατα ΠολλαπλώνΝηµάτων ΣυγχρονισµόςσεΣυστήµατα ΠολλαπλώνΝηµάτων Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ Κορνήλιος Κούρτης kkourt@cslab.ece.ntua.gr p. 1 Περιβάλλον Πολλαπλών Νηµάτων Threads T0

Διαβάστε περισσότερα

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων Εργαστήριο Java Lab09 Αντικείμενο: Πολυνηματικές εφαρμογές Η χρήση περισσότερων από μιας ροής εντολών μέσα σε ένα πρόγραμμα είναι γνωστή ως multithreading. H κάθε μια ροή εντολών μέσα στο πρόγραμμα ονομάζεται

Διαβάστε περισσότερα

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση ΑΤΔ με Συνδεδεμένες Λίστες -

Διαβάστε περισσότερα

Δομές Δεδομένων & Αλγόριθμοι

Δομές Δεδομένων & Αλγόριθμοι Ουρές Ουρές Περίληψη Η ΟυράΑΔΤ Υλοποίηση με κυκλικό πίνακα Αυξανόμενη Ουρά βασισμένη σε πίνακα Interface ουράς στην C++ Η Ουρά ADT Η ΑΔΤ Ουρά αποθηκεύει αυθαίρετα αντικείμενα Οι εισαγωγές και διαγραφές

Διαβάστε περισσότερα

Από τη UML στον Κώδικα. Μέρος Α

Από τη UML στον Κώδικα. Μέρος Α Από τη UML στον Κώδικα Μέρος Α περιεχόμενα παρουσίασης Κλάσεις Ισότητα αντικειμένων Μονόδρομες συσχετίσεις με πολλαπλότητα «ένα» Μονόδρομες συσχετίσεις με πολλαπλότητα «πολλά» Συλλογές από το σχέδιο στον

Διαβάστε περισσότερα

Υλοποίηση Σηματοφόρων

Υλοποίηση Σηματοφόρων Υλοποίηση Σηματοφόρων 1 lalis@inf.uth.gr Υλοποίηση σε επίπεδο συστήματος Εσωτερική κατάσταση: Ένας ακέραιος για την αποθήκευση της τιμής του σηματοφόρου Μια ουρά αναμονής που τοποθετείται ένα νήμα όταν

Διαβάστε περισσότερα

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15 Οι βασικές έννοιες που θα καλύψουμε Ομαδοποίηση αντικειμένων Εισαγωγή στις συλλογές Γενικές κλάσεις Iterators Συλλογές (ειδικά την ArrayList) Συνεχίζουμε την αναφορά στο θέμα της αφαίρεσης (abstraction)

Διαβάστε περισσότερα

Διάλεξη 10: Αλγόριθμοι Αμοιβαίου Αποκλεισμού σε περιβάλλον ανταλλαγής μηνυμάτων. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

Διάλεξη 10: Αλγόριθμοι Αμοιβαίου Αποκλεισμού σε περιβάλλον ανταλλαγής μηνυμάτων. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι Διάλεξη 10: Αλγόριθμοι Αμοιβαίου Αποκλεισμού σε περιβάλλον ανταλλαγής μηνυμάτων ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι Τι θα δούμε σήμερα Αλγόριθμος Χρήση Συντονιστή Αλγόριθμος του Lamport Αλγόριθμος LeLann:

Διαβάστε περισσότερα

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ Ε Ρ Γ Α Σ ΤΗΡΙΟ ΥΠΟΛ Ο Γ Ι Σ ΤΙ Κ Ω Ν Σ Υ Σ ΤΗ ΜΑ ΤΩΝ www. c s l a b.

Διαβάστε περισσότερα

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1 Διασυνδεδεμένες Δομές Λίστες Προγραμματισμός II 1 lalis@inf.uth.gr Διασυνδεδεμένες δομές Η μνήμη ενός πίνακα δεσμεύεται συνεχόμενα η πρόσβαση στο i-οστό στοιχείο είναι άμεση καθώς η διεύθυνση του είναι

Διαβάστε περισσότερα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα ΝΗΜΑΤΑ ΣΤΗ JAVA (1) Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα πρόγραµµα. Αιτία Η δυνατότητα αποµόνωσης (ή αυτονόµησης) κάποιων

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008 ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008 Κατασκευαστές (Constructors) Ειδικός τύπος μεθόδων, οι οποίες: - είναι public και έχουν το ίδιο όνομα με αυτό της κλάσης - χρησιμοποιούνται για να αρχικοποιήσουν κάποιες

Διαβάστε περισσότερα

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) ΙΙΙ 1 lalis@inf.uth.gr Υποθέσεις εργασίας Νήματα/διεργασίες με κοινή μνήμη Αυτόματη διακοπή/εναλλαγή νημάτων/διεργασιών (π.χ. πάνω από 1 CPU

Διαβάστε περισσότερα

2.4 Κλασσικά Προβλήματα IPC

2.4 Κλασσικά Προβλήματα IPC 2.4 Κλασσικά Προβλήματα IPC 1 Οι φιλόσοφοι που γευματίζουν - Dining Philosophers Μια πρώτη λύση για Ν φιλοσόφους: philosopher (i) while (1) { think; take_fork(i);/* πάρε αριστερό ξυλάκι */ take_fork(i+1

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 13: Ταυτόχρονος Προγραμματισμός Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν

Διαβάστε περισσότερα

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) ΙΙΙ 1 lalis@inf.uth.gr Υποθέσεις εργασίας Νήματα/διεργασίες με κοινή μνήμη Αυτόματη διακοπή/εναλλαγή νημάτων/διεργασιών (π.χ. πάνω από 1 CPU

Διαβάστε περισσότερα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( ) Τύποι Δεδομένων και Απλές Δομές Δεδομένων Παύλος Εφραιμίδης V1.0 (2014-01-13) Απλές Δομές Δεδομένων Στην ενότητα αυτή θα γνωρίσουμε ορισμένες απλές Δομές Δεδομένων και θα τις χρησιμοποιήσουμε για την αποδοτική

Διαβάστε περισσότερα

Προσπέλαση κοινών πόρων Πρωτόκολλα ελέγχου αμοιβαίου αποκλεισμού

Προσπέλαση κοινών πόρων Πρωτόκολλα ελέγχου αμοιβαίου αποκλεισμού Λειτουργικά Συστήματα Πραγματικού Χρόνου 2006-07 Προσπέλαση κοινών πόρων Πρωτόκολλα ελέγχου αμοιβαίου αποκλεισμού Μ.Στεφανιδάκης Κοινοί πόροι Κοινοί (διαμοιραζόμενοι) πόροι με μία η περισσότερες μονάδες

Διαβάστε περισσότερα

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 16: Σωροί Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις Ουρά Προτεραιότητας Η δομή

Διαβάστε περισσότερα

Βασικά Στοιχεία της Java

Βασικά Στοιχεία της Java Βασικά Στοιχεία της Java Παύλος Εφραιμίδης Java Βασικά Στοιχεία της γλώσσας Java 1 Τύποι Δεδομένων Η Java έχει δύο κατηγορίες τύπων δεδομένων: πρωτογενείς (primitive) τύπους δεδομένων αναφορές Java Βασικά

Διαβάστε περισσότερα

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας Ουρές Προτεραιότητας Ουρά Προτεραιότητας (Priority Queue) Μια συλλογή αντικειμένων που χαρακτηρίζονται από μια συγκρίσιμη προτεραιότητα. Έχει την λογική εικόνα μιας δομής δεδομένων όπου, αντικείμενα εισέρχονται

Διαβάστε περισσότερα

Προβλήματα Συγχρονισμού (με ελεγκτή) Ταυτόχρονος Προγραμματισμός 1

Προβλήματα Συγχρονισμού (με ελεγκτή) Ταυτόχρονος Προγραμματισμός 1 Προβλήματα Συγχρονισμού (με ελεγκτή) Ταυτόχρονος Προγραμματισμός 1 lalis@inf.uth.gr Υλοποίηση σηματοφόρων Οι σηματοφόροι είναι ένας ΑΤΔ με συγκεκριμένες λειτουργίες πρόσβασης Μπορεί να υλοποιηθούν με «φυσικό»

Διαβάστε περισσότερα

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη) ΙΙΙ 1 lalis@inf.uth.gr Υποθέσεις εργασίας Νήματα/διεργασίες με κοινή μνήμη Αυτόματη διακοπή/εναλλαγή νημάτων/διεργασιών (π.χ. πάνω από 1 CPU

Διαβάστε περισσότερα

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟ ΛΟ ΓΙ ΣΤΙ ΚΩΝ ΣΥΣΤΗΜΑΤΩΝ www. c sl a b. ec e. n t ua. gr

Διαβάστε περισσότερα

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 7: Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Πράξεις Εισαγωγής, Εύρεσης Στοιχείου, Διαγραφής Μικρότερου Στοιχείου Διδάσκων:

Διαβάστε περισσότερα

3 η ΑΣΚΗΣΗ. Προηγμένα Θέματα Αρχιτεκτονικής Υπολογιστών

3 η ΑΣΚΗΣΗ. Προηγμένα Θέματα Αρχιτεκτονικής Υπολογιστών ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ www.cslab.ece.ntua.gr 3 η ΑΣΚΗΣΗ Προηγμένα

Διαβάστε περισσότερα

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων 2 Βασικές Εντολές 2.1. Εντολές Οι στην Java ακολουθούν το πρότυπο της γλώσσας C. Έτσι, κάθε εντολή που γράφουμε στη Java θα πρέπει να τελειώνει με το ερωτηματικό (;). Όπως και η C έτσι και η Java επιτρέπει

Διαβάστε περισσότερα

Αμοιβαίος αποκλεισμός

Αμοιβαίος αποκλεισμός Αμοιβαίος αποκλεισμός 1. Εισαγωγή 2. Κρίσιμα τμήματα (Critical Sections) 3. Υλοποίηση του αμοιβαίου αποκλεισμού I. Προσεγγίσεις λογισμικού II. Υποστήριξη εκ μέρους του υλικού III. Σηματοφορείς 4. Κλασσικά

Διαβάστε περισσότερα

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή ΑΕΜ ΒΑΘΜΟΣ ΣΧΟΛΙΑ 00497 -Δεν ελέγχετε αν η createlist εκτελλέστικε σωστά και δεν τερµατίζετε το πρόγραµµα σε διαφορετική -Σωστά βρίσκετε το σηµείο στο οποίο πρέπει να προστεθεί ο κόµβος. -Σωστά τερµατίζετε

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Εργαστήριο 2 Βασικοί Τύποι Μεταβλητών Java

Διαβάστε περισσότερα

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1 Κλάσεις στη Java Παύλος Εφραιμίδης Java Κλάσεις στη Java 1 Κλάσεις στην Java Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack Κλάσεις στην Java Κλάσεις στη Java Παύλος Εφραιμίδης Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 1 Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.

Διαβάστε περισσότερα

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1

Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1 Κλείδωμα αρχείων (file locking) Προγραμματισμός II 1 lalis@inf.uth.gr Κλείδωμα αρχείων Οι διεργασίες που προσπελάζουν ένα αρχείο μέσω ξεχωριστών περιγραφέων, μπορούν να γράψουν / διαβάσουν τα περιεχόμενα

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 3 ο Συνδεδεµένες Λίστες Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση ΟΑΤ λίστα Ακολουθιακή λίστα Συνδεδεµένη λίστα

Διαβάστε περισσότερα

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες Δομές δεδομένων Πίνακες Οι πίνακες είναι το πιο απλό «μέσο» αποθήκευσης ομοειδούς πληροφορίας. Χρησιμοποιούν ακριβώς όση μνήμη χρειάζεται για την αποθήκευση της πληροφορίας Επιτρέπουν την προσπέλαση άμεσα

Διαβάστε περισσότερα

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ Δομές Δεδομένων Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού

Διαβάστε περισσότερα

Συγχρονισμός. Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο ΣΗΜΜΥ ακ. έτος CSLab. Κορνήλιος Κούρτης

Συγχρονισμός. Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο ΣΗΜΜΥ ακ. έτος CSLab. Κορνήλιος Κούρτης Συγχρονισμός Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο ΣΗΜΜΥ ακ. έτος 2009-2010 CSLab National Technical University of Athens Κορνήλιος Κούρτης kkourt@cslab.ece.ntua.gr Εργαστήριο Υπολογιστικών Συστημάτων

Διαβάστε περισσότερα

FAIL PASS PASS οριακά

FAIL PASS PASS οριακά AEM 0001 0002 COMMENTS οριακά -Το πρόγραµµά σου δουλεύει λάθος για τις εισόδους: 7 -Δεν έχεις µεριµνήσει για την περίπτωση step=1. Μπορούσες να θεωρήσεις ειδική περίπτωση και να την υλοποιείς σε άλλον

Διαβάστε περισσότερα

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης Σύνοψη Προηγούμενου Λίστες (Lists) Ορέστης Τελέλης telelis@unipi.gr Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς Στοίβες (Stacks) : στην κορυφή της στοίβας ( ) από την κορυφή της στοίβας ( ) Ουρές

Διαβάστε περισσότερα

4. Συνδεδεμένες Λίστες

4. Συνδεδεμένες Λίστες Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 4. Συνδεδεμένες Λίστες 2 ομές εδομένων 4 5 Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων 10/11/2016 Εισαγωγή

Διαβάστε περισσότερα

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 0: Λίστες ΙΙ Κυκλικές Λίστες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Κυκλικές Απλά Συνδεδεμένες Λίστες - Κυκλικές Διπλά Συνδεδεμένες

Διαβάστε περισσότερα

Κεφάλαιο 10 Ψηφιακά Λεξικά

Κεφάλαιο 10 Ψηφιακά Λεξικά Κεφάλαιο 10 Ψηφιακά Λεξικά Περιεχόμενα 10.1 Εισαγωγή... 213 10.2 Ψηφιακά Δένδρα... 214 10.3 Υλοποίηση σε Java... 222 10.4 Συμπιεσμένα και τριαδικά ψηφιακά δένδρα... 223 Ασκήσεις... 225 Βιβλιογραφία...

Διαβάστε περισσότερα

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA 1. Εισαγωγή Τι είναι Νήµα; Κάθε νήµα εκτέλεσης είναι ουσιαστικά

Διαβάστε περισσότερα

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1 Κρίσιμη Περιοχή Υπό Συνθήκη (onditional ritical Regions) Ταυτόχρονος Προγραμματισμός 1 lalis@inf.uth.gr Πέρα από ελεγκτές Ο ελεγκτής είναι χρήσιμο εργαλείο συγχρονισμού παρέχει στον προγραμματιστή εγγυημένο

Διαβάστε περισσότερα

4 Συλλογές Αντικειμένων

4 Συλλογές Αντικειμένων 4 Συλλογές Αντικειμένων Πώς χειριζόμαστε αντικείμενα σε ομάδες με επανάληψη Η Απαίτηση Συλλογών Αντικειμένων Πολλές εφαρμογές χρειάζονται πλήθος αντικειμένων: Κατάλογος βιβλίων Φοιτητολόγιο Πελατολόγιο

Διαβάστε περισσότερα

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ Σχεδιασμός και υλοποίηση υποδομής σημείωσης διεργασιών στον

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ οµηµένος Προγραµµατισµός Ανοιξη 5 Μάθηµα 5 ο Ουρά Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση Αφηρηµένος Τύπος εδοµένων Ουρά Υλοποίηση µε Κυκλικό Πίνακα Υλοποίηση

Διαβάστε περισσότερα

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος 2010-2011

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος 2010-2011 ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ KΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ http://www.cslab.ece.ntua.gr Θέμα

Διαβάστε περισσότερα

Διάλεξη 8: Πρόβλημα Αμοιβαίου Αποκλεισμού. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι

Διάλεξη 8: Πρόβλημα Αμοιβαίου Αποκλεισμού. ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι Διάλεξη 8: Πρόβλημα Αμοιβαίου Αποκλεισμού ΕΠΛ 432: Κατανεμημένοι Αλγόριθμοι Τι θα δούμε σήμερα Μοντέλο Κοινόχρηστης Μνήμης Αλγόριθμοι Αμοιβαίου Αποκλεισμού με Ισχυρούς Καταχωρητές ΕΠΛ432: Κατανεµηµένοι

Διαβάστε περισσότερα

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 14 η Διαχείριση Μνήμης και Δομές Δεδομένων Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη

Διαβάστε περισσότερα

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Πίνακες Συµβόλων Κεφάλαιο 12 ( ) Ε. Μαρκάκης Επίκουρος Καθηγητής ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Πίνακες Συµβόλων Κεφάλαιο 12 (12.1-12.4) Ε. Μαρκάκης Επίκουρος Καθηγητής Περίληψη Πίνακες συµβόλων Διεπαφή πίνακα συµβόλων Αναζήτηση µε αριθµοδείκτη Ακολουθιακή αναζήτηση Δυαδική αναζήτηση

Διαβάστε περισσότερα