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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εργαστήριο 5 fork(), exec(), signals

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

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

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

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

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

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

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

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

Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4. Λειτουργικά Συστήματα- Φροντιστήριο 2

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

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

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

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

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

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

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

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Εργαστήριο 7 fork(), exec(), signals

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

Περιγραφή και Έλεγχος ιεργασιών

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

Εισαγωγή Βασικές εντολές Εκτέλεση βήµα-βήµα Εξέταση/Ανάθεση GDB-101. Νίκος Ντάρµος Τµήµα Πληροφορικής Πανεπιστήµιο Ιωαννίνων

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Υπολογισμός - Εντολές Ελέγχου

Νήµατα. Πολύ σηµαντικό

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

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Χρήση των POSIX Threads

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 4-2

Προγραμματισμός Ι (ΗΥ120)

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

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

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

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

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

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

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

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

Φροντιςτήριο. Linked-List

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

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

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

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

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

Προγραμματισμός Ι (ΗΥ120)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Προγραμματισμός συστημάτων UNIX/POSIX. Διαδιεργασιακή επικοινωνία: αγωγοί (IPC inter-process communication: pipes)

Προγραµµατισµός Νηµάτων. Αρχικοποίηση µιας Φοράς pthread_once_t once_block = PTHREAD_ONCE_INIT; pthread_mutex_t mutex;

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

Διάλεξη 5: Δείκτες και Συναρτήσεις

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4

Προγραμματισμό για ΗΜΥ

Transcript:

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 HyperThreading 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() 11

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 <stdio.h> #include <pthread.h> #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; http://netcins.ceid.upatras.gr/opsysi/project/threads/thread_create.c 13

#include <pthread.h> #include <stdio.h> #define NUM_THREADS 3 void *BusyWork(void *null) { int i; double result=0.0; for (i=0; i<1000000; 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 = 1.073937e+15 Thread result = 1.073861e+15 Thread result = 1.073767e+15 Completed join with thread 0 status= 0 Completed join with thread 1 status= 0 Completed join with thread 2 status= 0 http://netcins.ceid.upatras.gr/opsysi/project/threads/thread_join.c 14

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

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); 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. /* Clean up and exit */ pthread_attr_destroy(&attr); pthread_mutex_destroy(&count_mutex); pthread_cond_destroy(&count_threshold_cv); pthread_exit(null); 16

Αντί για sleep, χρησιμοποιούμε το pthread_cond_timedwait http://netcins.ceid.upatras.gr/opsysi/project/threads/thread_timed_wait.c 17

http://netcins.ceid.upatras.gr/opsysi/project/posixthreads.htm http://netcins.ceid.upatras.gr/opsysi/project/threads 18