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

Σχετικά έγγραφα
Παρουσίαση 5 ης Άσκησης:

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

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

Διεργασίες και Νήματα (2/2)

NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4

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

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

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

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

Προγραμματισμός με Κοινόχρηστο Χώρο Διευθύνσεων 4

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

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

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

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

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

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (pthreads)

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ ΜΑΘΗΜΑ: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

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

Parallel Implementation of John Conway s Game of Life

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΝΗΜΑΤΑ

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

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

Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

ΝΗΜΑΤΑ - ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διαδιεργασιακή Επικοινωνία Εργαστηριακές Ασκήσεις

Περίληψη. Υπερυπολογιστές. Υπολογιστικά προβλήµατα. TOP 500 (Ιούνιος 2007) TOP 500 (Ιούνιος 2009) Ε-85: Ειδικά Θέµατα Λογισµικού

Η πολυνηματική γλώσσα προγραμματισμού Cilk

ή α α POSIX Threads ( έ ος 1 ο )

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Ε-85: Ειδικά Θέµατα Λογισµικού

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP

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

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Λειτουργικά Συστήματα. Ενότητα # 10: Προγραμματισμός UNIX Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

Κατηγορίες Νηµάτων. Νήµατα Επιπέδου Πυρήνα. Νήµατα Επιπέδου Χρήστη. «Νήµατα Επιπέδου Χρήστη» Ε-85: Ειδικά Θέµατα Λογισµικού

Μεθόδων Επίλυσης Προβλημάτων

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

26/3/2012 Προγραμματισμός συστημάτων κοινόχρηστης μνήμης (Ι) Β. Δημακόπουλος

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Διάλεξη 22η: Επιπλέον στοιχεία της C

Εργαστήριο 9: Αρχεία

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

Διάλεξη 11η: Δείκτες, μέρος 1

Προγραμματισμός συστημάτων UNIX/POSIX

Κατανεμημένα Συστήματα

Διάλεξη 9η: Πίνακες (arrays)

Προγραμματισμός Η/Υ (ΤΛ2007 )

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

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

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

OpenMP. Προγραµµατισµός Αρχιτεκτονικών Μοιραζόµενης Μνήµης. Συστήµατα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστηµάτων ΕΜΠ. OpenMP p.

Δομημένος Προγραμματισμός

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

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

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

Cilk: Φιλοσοφία και Χρήση

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Ε-85: Ειδικά Θέµατα Λογισµικού

Λειτουργικά συστήματα πραγματικού χρόνου

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

Παρουςίαςθ 2 θσ Άςκθςθσ:

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Μεθόδων Επίλυσης Προβλημάτων

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Διάλεξη 12η: Δείκτες, μέρος 2

Εισαγωγή στον Προγραμματισμό (με. τη C)

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Πληροφορική & Τηλεπικοινωνίες K25 Ανάπτυξη Λογισμικού Εαρινό Εξάμηνο 2008 Καθηγητής Γιάννης Ιωαννίδης. Μέρος 2ο: Επίπεδο Ευρετηρίου Β+ Δένδρων

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

Transcript:

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

Posix Τhreads (Pthreads) Βιβλιοθήκη + σύστημα χρόνου εκτέλεσης (runtime) για την διαχείριση (δημιουργία, εκτέλεση, τερματισμό) νημάτων παρέχονται και δομές/ρουτίνες για τον συγχρονισμό των νημάτων pthread_t: αναγνωριστικό ενός νήματος Κυριότερες ρουτίνες διαχείρισης νημάτων pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) Δημιουργία ενός νήματος το οποίο θα εκτελέσει την συνάρτηση void *start_routine(void *) με όρισμα το arg pthread_join(pthread_t thread, void **retval) Αναμονή εώς τον τερματισμό του νήματος με το αναγνωριστικό thread. Η τιμή που επιστρέφεται από το νήμα αποθηκεύεται στο *retval. Κάποιες δομές/ρουτίνες συγχρονισμού pthread_mutex_t, pthread_mutex_init( ), pthread_mutex_lock( ), pthread_mutex_unlock( ), pthread_mutex_destroy( ) pthread_spinlock_t, pthread_spin_init( ), pthread_spin_lock( ), pthread_spin_unlock( ), pthread_spin_destroy( ) pthread_barrier_t, pthread_barrier_init( ), pthread_barrier_wait( ), pthread_barrier_destroy( ) 2

Παράδειγμα Pthreads #include <stdio.h> #include <pthread.h> /* Global data. */ pthread_spinlock_t output_spinlock; pthread_barrier_t global_barrier; /* The function executed by each thread. */ void *hello_tid(void *targ) { int myid = *((int *)targ); /* Wait until all threads are here. */ pthread_barrier_wait(&global_barrier); /* Grab the lock and print thread s message. */ pthread_spin_lock(&output_spinlock); printf( Hello, I am thread %d\n, myid); pthread_spin_unlock(&output_spinlock); return NULL; #define NTHREADS 16 int main() { pthread_t threads[nthreads]; int thread_ids[nthreads]; /* Global data initializations. */ pthread_spin_init(&output_spinlock, PTHREAD_PROCESS_SHARED); pthread_barrier_init(&global_barrier, NULL, NTHREADS); /* Create and spawn all threads. */ for (i=0; i < nthreads; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, hello_tid, &thread_ids[i]); /* Wait all threads to finish. */ for (i=0; i < nthreads; i++) pthread_join(threads[i], NULL); pthread_spin_destroy(&output_spinlock); pthread_barrier_destroy(&global_barrier); return 0; Μεταγλώττιση με: $ gcc Wall Wextra pthread o threads threads.c 3

Παράδειγμα Pthreads #include <stdio.h> #include <pthread.h> /* Global data. */ pthread_spinlock_t output_spinlock; pthread_barrier_t global_barrier; /* The function executed by each thread. */ void *hello_tid(void *targ) { int myid = *((int *)targ); /* Wait until all threads are here. */ pthread_barrier_wait(&global_barrier); /* Grab the lock and print thread s message. */ pthread_spin_lock(&output_spinlock); printf( Hello, I am thread %d\n, myid); pthread_spin_unlock(&output_spinlock); return NULL; #define NTHREADS 16 int main() { pthread_t threads[nthreads]; int thread_ids[nthreads]; /* Global data initializations. */ pthread_spin_init(&output_spinlock, PTHREAD_PROCESS_SHARED); pthread_barrier_init(&global_barrier, NULL, NTHREADS); /* Create and spawn all threads. */ for (i=0; i < nthreads; i++) { Δημιουργία των thread_ids[i] = i; νημάτων pthread_create(&threads[i], NULL, hello_tid, &thread_ids[i]); /* Wait all threads to finish. */ for (i=0; i < nthreads; i++) pthread_join(threads[i], NULL); pthread_spin_destroy(&output_spinlock); pthread_barrier_destroy(&global_barrier); return 0; Μεταγλώττιση με: $ gcc Wall Wextra pthread o threads threads.c 3

Παράδειγμα Pthreads #include <stdio.h> #include <pthread.h> /* Global data. */ pthread_spinlock_t output_spinlock; pthread_barrier_t global_barrier; /* The function executed by each thread. */ void *hello_tid(void *targ) { int myid = *((int *)targ); /* Wait until all threads are here. */ pthread_barrier_wait(&global_barrier); /* Grab the lock and print thread s message. */ pthread_spin_lock(&output_spinlock); printf( Hello, I am thread %d\n, myid); pthread_spin_unlock(&output_spinlock); return NULL; #define NTHREADS 16 int main() { pthread_t threads[nthreads]; int thread_ids[nthreads]; /* Global data initializations. */ pthread_spin_init(&output_spinlock, PTHREAD_PROCESS_SHARED); pthread_barrier_init(&global_barrier, NULL, NTHREADS); /* Create and spawn all threads. */ for (i=0; i < nthreads; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, hello_tid, &thread_ids[i]); /* Wait all threads to finish. */ for (i=0; i < nthreads; i++) pthread_join(threads[i], NULL); pthread_spin_destroy(&output_spinlock); pthread_barrier_destroy(&global_barrier); Δημιουργία των νημάτων Εκτέλεση της συνάρτησης hello_tid() return 0; Μεταγλώττιση με: $ gcc Wall Wextra pthread o threads threads.c 3

Παράδειγμα Pthreads #include <stdio.h> #include <pthread.h> /* Global data. */ pthread_spinlock_t output_spinlock; pthread_barrier_t global_barrier; /* The function executed by each thread. */ void *hello_tid(void *targ) { int myid = *((int *)targ); /* Wait until all threads are here. */ pthread_barrier_wait(&global_barrier); /* Grab the lock and print thread s message. */ pthread_spin_lock(&output_spinlock); printf( Hello, I am thread %d\n, myid); pthread_spin_unlock(&output_spinlock); return NULL; #define NTHREADS 16 int main() { pthread_t threads[nthreads]; int thread_ids[nthreads]; /* Global data initializations. */ pthread_spin_init(&output_spinlock, PTHREAD_PROCESS_SHARED); pthread_barrier_init(&global_barrier, NULL, NTHREADS); /* Create and spawn all threads. */ for (i=0; i < nthreads; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, hello_tid, &thread_ids[i]); /* Wait all threads to finish. */ for (i=0; i < nthreads; i++) pthread_join(threads[i], NULL); pthread_spin_destroy(&output_spinlock); pthread_barrier_destroy(&global_barrier); Δημιουργία των νημάτων Εκτέλεση της συνάρτησης hello_tid() Αναμονή μέχρι να τερματίσουν τα νήματα return 0; Μεταγλώττιση με: $ gcc Wall Wextra pthread o threads threads.c 3

Παράδειγμα Pthreads #include <stdio.h> #include <pthread.h> /* Global data. */ pthread_spinlock_t output_spinlock; pthread_barrier_t global_barrier; /* The function executed by each thread. */ void *hello_tid(void *targ) { int myid = *((int *)targ); /* Wait until all threads are here. */ pthread_barrier_wait(&global_barrier); /* Grab the lock and print thread s message. */ pthread_spin_lock(&output_spinlock); printf( Hello, I am thread %d\n, myid); pthread_spin_unlock(&output_spinlock); Όλα τα νήματα μπαίνουν στο return NULL; «κρίσιμο τμήμα» ταυτόχρονα #define NTHREADS 16 int main() { pthread_t threads[nthreads]; int thread_ids[nthreads]; /* Global data initializations. */ pthread_spin_init(&output_spinlock, PTHREAD_PROCESS_SHARED); pthread_barrier_init(&global_barrier, NULL, NTHREADS); /* Create and spawn all threads. */ for (i=0; i < nthreads; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, hello_tid, &thread_ids[i]); /* Wait all threads to finish. */ for (i=0; i < nthreads; i++) pthread_join(threads[i], NULL); pthread_spin_destroy(&output_spinlock); pthread_barrier_destroy(&global_barrier); Δημιουργία των νημάτων Εκτέλεση της συνάρτησης hello_tid() Αναμονή μέχρι να τερματίσουν τα νήματα return 0; Μεταγλώττιση με: $ gcc Wall Wextra pthread o threads threads.c 3

Περιβάλλον εκτέλεσης Sandman: 4 x Intel Xeon E5-4620 (Sandy Bridge 8-core/16-threads) Συνολικά 32 πυρήνες και 64 threads (Hyperthreading) NUMA (Non-Uniform Memory Access) 4

Thread affinity Ένα νήμα μπορεί να τοποθετηθεί σε οποιονδήποτε πυρήνα είναι επιλογή του χρονοδρομολογητή του ΛΣ Μπορούμε να ορίσουμε συγκεκριμένο πυρήνα για κάθε νήμα με χρήση της sched_setaffinity(). για τους σκοπούς της άσκησης παρέχεται η setaffinity_oncpu(unsigned int cpu) στο /home/parallel/pps/2017-2018/a5/common/aff.c Αρίθμηση των πυρήνων του sandman socket0: 0-7, 32-39 socket1: 8-15, 40-47 socket2: 16-23, 48-55 socket3: 24-31, 56-63 5

Ζήτημα 1: Λογαριασμοί Tράπεζας Ένας πίνακας αντιπροσωπεύει τους λογαριασμούς των πελατών μιας τράπεζας Κάθε νήμα εκτελεί ένα σύνολο λειτουργιών σε ξεχωριστό λογαριασμό Υπάρχει ανάγκη συγχρονισμού; Ποια αναμένετε να είναι η συμπεριφορά του προγράμματος καθώς προστίθενται νήματα; Πώς επηρεάζει η τοποθέτηση των νημάτων στους πυρήνες του μηχανήματος την επίδοση της εφαρμογής; Νήμα 1 Νήμα 2 Νήμα 3... Νήμα N accounts 6

Ζήτημα 2: Αμοιβαίος Αποκλεισμός - Κλειδώματα Προστασία κρίσιμου τμήματος με διαφορετικές υλοποιήσεις κλειδωμάτων Κρίσιμο τμήμα: αναζητήσεις τυχαίων κλειδιών σε ταξινομημένη συνδεδεμένη λίστα. read-only CS: μας ενδιαφέρει απλά να εξετάσουμε το overhead που εισάγεται από κάθε υλοποίηση κλειδώματος Δίνονται: tas lock: test and set clh lock: queue lock Ζητούνται: pthread lock: χρησιμοποιεί το pthread_spinlock_t των pthreads ttas lock: test-and-test-and-set lock array lock: lock βασισμένο σε πίνακα 7

Ζήτημα 3: Τακτικές συγχρονισμού για δομές δεδομένων Υλοποίηση ταξινομημένης συνδεδεμένης λίστας με χρήση διαφορετικών τεχνικών συγχρονισμού. Καλείστε να υλοποιήσετε: fine-grain locking: hand-over-hand locking optimistic lazy non-blocking Λεπτό ζήτημα: σε δομές όπως οι optimistic, lazy και non-blocking η διαχείριση μνήμης είναι δύσκολη. Για τους σκοπούς της άσκησης δεν χρειάζεται να ελευθερώνετε τους κόμβους της λίστας. Πειράματα για διαφορετικά μεγέθη λίστας για διαφορετικά workloads (αναλογία αναζητήσεων, εισαγωγών, διαγραφών) 8