NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4 1.  Ένα thread έχει: ID, program counter, register set, stack  Μοιράζεται με τα άλλα threads της ίδιας διεργασίας.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11.
Advertisements

Νήματα στη Java Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Υλοποίηση μεταφραστή C με επεκτάσεις OpenMP Λεοντιάδης Ηλίας Τζούμας Γεώργιος Πτυχιακή εργασία Τελική παρουσίαση Υπεύθυνος καθηγητής Β. Β. Δημακόπουλος.
Βήματα στην εκτέλεση μιας διαδικασίας (procedure) 1.Τοποθέτηση παραμέτρων 2.Μεταβίβαση ελέγχου στη διαδικασία 3.Λήψη πόρων αποθήκευσης.
Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες
Κεφάλαιο 6 Threads. 2 Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΜΑΘ-3122/106 Προγραμματισμός
29/11/2004Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2004 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
1/12/2003Εισαγωγή στο OpenMP1 OpenMP Αθήνα, Νοέμβριος 2003 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
Λειτουργικά Συστήματα
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
24/11/2003Message Passing Interface (MPI)1 Αθήνα, Νοέμβριος 2003 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
22/11/2004Message Passing Interface (MPI)1 Αθήνα, Νοέμβριος 2004 Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων.
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
Τεχνολογία ΛογισμικούSlide 1 Έλεγχος Καταψύκτη (Ada) Τεχνολογία ΛογισμικούSlide 39 with Pump, Temperature_dial, Sensor, Globals, Alarm; use Globals ; procedure.
Databases & Qt Μανούσης Πέτρος ΑΜ: 862
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 11 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 1.
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 19 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 1.
Νήματα Οι διεργασίες έχουν τα παρακάτω συστατικά:
Π ΑΡΑΛΛΗΛΗ / ΚΑΤΑΝΕΜΗΜΕΝΗ ΕΠΕΞΕΡΓΑΣΙΑ ΚΑΙ ΕΦΑΡΜΟΓΕΣ Εισαγωγή στο OpenMP.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
ΕΠΑΝΑΛΗΨΗΕΠΑΝΑΛΗΨΗ ΠΡΟΓΡΑΜΜΑΤΑ. ΠΡΟΓΡΑΜΜΑ 1 ΕΞΗΓΗΣΤΕ ΤΙ ΕΞΟΔΟ ΠΑΡΑΓΕΙ ΤΟ ΠΑΡΑΚΑΤΩ ΠΡΟΓΡΑΜΜΑ #include int main() { char ch; int i; float fl; printf("dose.
Τι είναι διεργασία Ένα πρόγραμμα σε εκτέλεση Η διεργασία περιλαμβάνει:
Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4 1.
Message Passing Interface (MPI) Συστήματα Παράλληλης Επεξεργασίας Εργαστήριο Υπολογιστικών Συστημάτων Αθήνα, Δεκέμβριος 2002.
Ντίρλης Νίκος- ΕΤΥ 4ο ΦΡΟΝΤΙΣΤΗΡΙΟ Παρασκευή Β4 1.
Επικοινωνία μεταξύ Διεργασιών και Σύνδρομες Διεργασίες Interprocess Communication and Concurrent Processes.
MΑΘ 106/3122Ξενοφών Ζαμπούλης ΜΑΘ 106/3122 Γλώσσα Προγραμματισμού Δείκτες (Pointers)
RPC Vs RMI Άλκης Γεωργόπουλος Αλέξανδρος Καρακασίδης Γεωργία Καστίδου Γεωργία Κολωνιάρη Αναστάσιος Κοντογιώργης Ηλίας Λεοντιάδης Μαρία Παπαφώτη Γιάννης.
1 Κλήσεις συναρτήσεων και προγραμματισμός με μηχανές καταστάσεων.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
JAVA: Threads Θ. Βαρβαρίγου Καθηγ. ΕΜΠ Τηλ
ΜΑΘ3122/106 – Γλώσσα προγραμματισμούΞενοφών Ζαμπούλης ΜΑΘ3122/106 Γλώσσα προγραμματισμού Συναρτήσεις.
RPC Multithreaded voting system Γεωργόπουλος Άλκης Κολωνιάρη Γεωργία Κοντογιώργης Τάσος Λεοντιάδης Ηλίας Πετράκης Γιάννης.
Διεργασίες Λειτουργικά Συστήματα. Λειτουργικά Συστήματα/ Slide 2 Η Έννοια της Διεργασίας * Διεργασία (Process) – ο μηχανισμός εκτέλεσης ενός προγράμματος.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
Λειτουργικά Συστήματα
Threads Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Syntax Directed Translation and alpha Language.
Κεφάλαιο 4 Εξαιρέσεις. Όταν σε ένα πρόγραμμα συμβεί κάποιο λάθος, ο κώδικας εγείρει (throw) μία εξαίρεση. Στη Java oι εξαιρέσεις εκπροσωπούνται από αντικείμενα.
HY150Ξενοφών Ζαμπούλης HY150 Ε π ι π λέον στοιχεία της C.
Διεργασίες.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
Κεφάλαιο 3 Τύποι Δεδομένων - Τελεστές. Πρωτογενείς τύποι δεδομένων: int, float, double, chars ΤύποςΌνομαΜέγεθος byte 8-bit signed, short 16-bit.
Νήματα με την χρήση των Posix Threads (pthreads)‏.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
ΔΠΘ-ΤΜΗΜΑ ΜΠΔ: ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ 1 Εισαγωγή στη γλώσσα Προγραμματισμού C ΠΙΝΑΚΕΣ (arrays)
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Κατανεμημένα Συστήματα
Συγχρονισμός Διεργασιών
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Τι είναι διεργασία Ένα πρόγραμμα σε εκτέλεση Η διεργασία περιλαμβάνει:

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Τεχνολογία και Προγραμματισμός Υπολογιστών

Διεργασίες Διεργασίες Διαδιεργασιακή Επικοινωνία (IPC)
Δημιουργία Διεργασιών
Processes.
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Εκπαιδευτική ρομποτική
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Μεταγράφημα παρουσίασης:

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

 Ένα thread έχει: ID, program counter, register set, stack  Μοιράζεται με τα άλλα threads της ίδιας διεργασίας τον κώδικα, τα δεδομένα και τους άλλους πόρους που του έχουν διατεθεί από το ΛΣ (σήματα, αρχεία κτλ)

Πλεονεκτήματα των νημάτων σε σχέση με τις διεργασίες:  Όταν μια process είναι blocked, τίποτα δεν τρέχει. Όταν ένα thread είναι blocked, τα άλλα threads της ίδιας process εκτελούνται.  Δημιουργία και τερματισμός threads είναι πολύ πιο οικονομικός από τις αντίστοιχες ενέργειες πάνω σε processes. Αυτό συμβαίνει κυρίως γιατί τα threads μιας διεργασίας μοιράζονται το ίδιο address space.

 Switch time ανάμεσα σε δύο threads είναι πολύ πιο μικρός  Communication time πολύ πιο μικρός.  Αξιοποίηση δυνατοτήτων σύγχρονων αρχιτεκτονικών (πχ Intel Hyper-Threading processors)

POSIX Threads library: pthread.h μας δίνει δυνατότητες να:  Δημιουργούμε και καταστρέφουμε threads  Passing messages and data between threads  Scheduling thread execution  Saving and restoring thread contexts

Η POSIX Threads library μας παρέχει τρεις μηχανισμούς συγχρονισμού:  mutexes - Mutual exclusion lock: Block access to variables by other threads. This enforces exclusive access by a thread to a variable or set of variables.  joins - Make a thread wait till others are complete (terminated).  condition variables - data type pthread_cond_t

 Θέματα παραλληλίας ◦ Όταν δημιουργούμε ένα νέο νήμα (thread) και τα δύο νήματα χρησιμοποιούν την ίδια μνήμη ◦ Αν το νέο νήμα κάνει κάποια αλλαγή στις μεταβλητές (π.χ., διαχείριση παραγγελίας) τότε αυτή η αλλαγή ενδεχομένως επηρεάζει άλλα νήματα ◦ Αν δύο νήματα θέλουν να αλλάξουν την ίδια μεταβλητή (π.χ., καταχώρηση νέας κράτησης) τι γίνεται ? ◦ Αυτό δημιουργεί θέματα αμοιβαίου αποκλεισμού -- mutex - 7 -

 Αρχικά η συνάρτηση main δημιουργεί το κεντρικό νήμα  Όλα τα υπόλοιπα νήματα πρέπει να δημιουργηθούν κατά την εκτέλεση - 8 -

 Αντίστοιχη της fork() για το process  Η συνάρτηση pthread_create έχει τις ακόλουθες παραμέτρους 1.Ταυτότητα (αριθμός) νήματος – τιμή που επιστρέφει η συνάρτηση 2.Παράμετροι νήματος – attributes, NULL για προκαθορισμένες παραμέτρους 3.Συνάρτηση εκκίνησης – η συνάρτηση που θα εκτελεστεί μόλις δημιουργηθεί το νέο νήμα 4.Παράμετροι συνάρτησης – οι μεταβλητές που θα περαστούν στην συνάρτηση μόλις εκτελεστεί - 9 -

int pthread_create( pthread\_t *tid, const pthread\_attr\_t *tattr, void*(*start_routine)(void *), void *arg ); Όταν ένα όρισμα δεν συγκεκριμενοποιείται τότε παίρνει την default τιμή. Με την pthread_attr_init() μπορείτε να ορίσετε αυτές τις default τιμές. Start_routine είναι η συνάρτηση που θα εκτελεστεί μόλις δημιουργηθεί το νήμα και arg οι παράμετροι που θα περάσουμε σε αυτή τη συνάρτηση. pthread_self()- return identifier of current thread

 Δημιουργία με pthread_create() ◦ int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); ◦ π.χ. pthread_create(&tid, &attr, thread_fn, arg)  Αναμονή για τερματισμό (pthread_exit()) με pthread_join()

int pthread_join( pthread_t th, void **thread_return );  th - thread suspended until the thread identified by th terminates, either by calling pthread_exit() or by being cancelled.  thread_return - If thread_return is not NULL, the return value of th is stored in the location pointed to by thread_return.  When you want the caller to wait until a specific thread terminates, supply that thread's ID as the first argument. If you are interested in the exit code of the defunct thread, supply the address of an area to receive it.  Αν δεν χρησιμοποιήσουμε την join, τι μπορεί να συμβεί;  H pthread_detach() είναι μια εναλλακτική της pthread_join()

//******************************************************** // This is a sample threaded program in C. //The main thread creates // 4 threads. Each thread simply prints out a message // before exiting. Notice that Ive set the thread //attributes to joinable. // Compilation: gcc threads.c -lpthread //******************************************************** #include #define NUM_THREADS 4 void *thread_function( void *arg ) { int id; id = *((int *)arg); printf( "Hello from thread %d!\n", id ); pthread_exit( NULL ); } int main( void ) { int i, tmp; int arg[NUM_THREADS] = {0,1,2,3}; pthread_t thread[NUM_THREADS]; pthread_attr_t attr; // initialize and set the thread attributes pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); // creating threads for ( i=0; i<NUM_THREADS; i++ ) { tmp = pthread_create( &thread[i], &attr, thread_function, (void *)&arg[i] ); if ( tmp != 0 ) { fprintf(stderr,"Creating thread %d failed!",i); return 1; } // joining threads for ( i=0; i<NUM_THREADS; i++ ) { tmp = pthread_join( thread[i], NULL ); if ( tmp != 0 ) { fprintf(stderr,"Joing thread %d failed!",i); return 1; } return 0; }

#include #define NUM_THREADS 3 void *BusyWork(void *null) { int i; double result=0.0; for (i=0; i< ; i++) { result = result + (double)random(); } printf("result = %e\n",result); pthread_exit((void *) 0); } int main (int argc, char *argv[]) { pthread_t thread[NUM_THREADS]; pthread_attr_t attr; int rc, t; void *status; /* Initialize and set thread detached attribute */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for(t=0; t<NUM_THREADS; t++) { printf("Creating thread %d\n", t); rc = pthread_create(&thread[t], &attr, BusyWork, NULL); if (rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } /* Free attribute and wait for the other threads */ pthread_attr_destroy(&attr); for(t=0; t<NUM_THREADS; t++) { rc = pthread_join(thread[t], &status); if (rc) { printf("ERROR;return code from pthread_join() is %d\n", rc); exit(-1); } printf("Completed join with thread %d status= %ld\n",t, (long)status); } pthread_exit(NULL); } Output: Creating thread 0 Creating thread 1 Creating thread 2 Thread result = e+15 Thread result = e+15 Thread result = e+15 Completed join with thread 0 status= 0 Completed join with thread 1 status= 0 Completed join with thread 2 status= 0

 Τί γίνεται όταν θέλουμε να μεταβάλουμε τις μεταβλητές;  Πρέπει να εξασφαλίσουμε αποκλειστική πρόσβαση  Αμοιβαίος Αποκλεισμός  Η βιβλιοθήκη pthreads υλοποιεί μηχανισμούς με το όνομα mutex  Προσφέρουν έναν απλό τρόπο για να συγχρονίσουμε τα νήματα  μπορούμε να ‘προστατέψουμε’ τις κοινές μεταβλητές επιτρέποντας μόνο σε 1 νήμα να έχει πρόσβαση ανά πάσα χρονική στιγμή ◦ Αναγκαστικά δημιουργούμε σημεία συμφόρησης του κώδικα ◦ Πρέπει να είναι όσο το δυνατόν λιγότερες γραμμές κώδικα (το Κρίσιμο Τμήμα)

int main (int argc, char *argv[]) { int i, rc; pthread_t threads[3]; pthread_attr_t attr; /* Initialize mutex and condition variable objects */ pthread_mutex_init(&count_mutex, NULL); pthread_cond_init (&count_threshold_cv, NULL); /* For portability, explicitly create threads in a joinable state */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&threads[0], &attr, inc_count, (void *)&thread_ids[0]); pthread_create(&threads[1], &attr, inc_count, (void *)&thread_ids[1]); pthread_create(&threads[2], &attr, watch_count, (void *)&thread_ids[2]); /* Wait for all threads to complete */ for (i=0; i<NUM_THREADS; i++) { pthread_join(threads[i], NULL); } printf ("Main(): Waited on %d threads. Done.\n", NUM_THREADS); /* Clean up and exit */ pthread_attr_destroy(&attr); pthread_mutex_destroy(&count_mutex); pthread_cond_destroy(&count_threshold_cv); pthread_exit(NULL); } Starting watch_count(): thread 2 inc_count(): thread 0, count = 1, unlocking mutex inc_count(): thread 0, count = 2, unlocking mutex inc_count(): thread 0, count = 3, unlocking mutex inc_count(): thread 0, count = 4, unlocking mutex inc_count(): thread 0, count = 5, unlocking mutex inc_count(): thread 0, count = 6, unlocking mutex inc_count(): thread 0, count = 7, unlocking mutex inc_count(): thread 0, count = 8, unlocking mutex inc_count(): thread 0, count = 9, unlocking mutex inc_count(): thread 0, count = 10, unlocking mutex inc_count(): thread 1, count = 11, unlocking mutex inc_count(): thread 1, count = 12 Threshold reached. inc_count(): thread 1, count = 12, unlocking mutex inc_count(): thread 1, count = 13, unlocking mutex inc_count(): thread 1, count = 14, unlocking mutex inc_count(): thread 1, count = 15, unlocking mutex inc_count(): thread 1, count = 16, unlocking mutex inc_count(): thread 1, count = 17, unlocking mutex inc_count(): thread 1, count = 18, unlocking mutex inc_count(): thread 1, count = 19, unlocking mutex inc_count(): thread 1, count = 20, unlocking mutex watch_count(): thread 2 Condition signal received. Main(): Waited on 3 threads. Done.

 Αντί για sleep, χρησιμοποιούμε το pthread_cond_timedwait

 