ι ο ι ά σ ή α α ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής
η α ο ό ηση ο α ό αι ι ό ι ό έχ ι α α χθ ί σ α αίσια ο αι ι ού έ ο ο ι άσ ο α. ο έ ο «Α οι ά Α α η αϊ ά αθή α α σ ο Οι ο ο ι ό Πα ισ ή ιο Αθη ώ» έχ ι χ α ο ο ήσ ι ό ο α α ια ό φωσ ο αι ι ού ι ού. ο έ ο ο οι ί αι σ ο αίσιο ο ιχ ι σια ού ο ά α ος «αί σ αι ια ίο άθ σ» αι σ χ α ο ο ί αι α ό ω αϊ ή Έ ωσ ω αϊ ό οι ω ι ό α ίο αι α ό θ ι ούς ό ο ς. 2
Ά ι ς ήσης ο α ό αι ι ό ι ό ό ι αι σ ά ι ς χ ήσ ς Creative Commons. 3
ο οί ό η ας Eισα ω ή σ ο ο α ι ό ο α α ισ ό ιά ισ ο α ι ού & ο ι ασια ού ο α α ισ ού ισα ω ή σ α PO IX Threads 4
Π ι ό α ό η ας ή α α αι ι ασί ς ή α α POSIX α α ί α α ισα ω ή σ ο σ χ ο ισ ό ιβ ιο αφία 5
ή α α αι ι ασί ς άθη α: ι ο ι ά σ ή α α, ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής
Βασι ές έ οι ς 1/3) ι ί αι έ α ή α; ί αι ια α ά οή ο ώ Χ ο ο ο α α ί αι χω ισ ά α ο ο ι ο ι ό σύσ α ιαισθ ι ός ο ισ ός ια αφ ιά ια ι ασία lightweight pro ess ί αι χω ισ ά α ο ο βασι ό ή α ο ο ά α ος ai thread of e e utio 7
Βασι ές έ οι ς / ο α ι ός ο α α ισ ός α ά οι ο ο ισ οί αχύ έ σ Α ά αι ιο α οί ό οι: α αβοσβή ι ο έ σο ας ο ι έ ο αθώς α βά ις ά α ύ ισ ς αι α ίσ οφα.α.. x4 ιο ή ο α; όχι.. Ό ως ιο ή ο α. 8
Βασι ές έ οι ς / POSIX Threads (pthreads) POSIX (Portable Operating System Interface) API standard ια σ αφή ά ω IEEE POSIX 1003.1c standard (1995) http://en.wikipedia.org/wiki/posix http://en.wikipedia.org/wiki/posix_threads 9
ι ασί ς ό α α σ έ σ α άσ ασ state) σ ο Unix PID (Process ID), process group ID, user ID, and group ID έχο ή ιο Working directory) ο ές ο ά α ος σ έ σ α αχω ές (registers, «σ οίβα» αι «σω ός» stack, heap) ι οι ω ία α ύ ι ασιώ (Inter-process communication) Ο ές ά ω message queues), σω ώσ ις pipes), σ α οφο ίς (semaphores), οι α ό ή (shared memory). FID (File descriptors), Signals, hared li raries 10
ι ασί ς αι ή α α α ή α α χ σι ο οιού ο ς ό ο ς ς ι ασίας ο α ή ο ού οις, χ ο ο ο/ ο αι ως α ά ς οές έ σ ς α ό ο. ώς; ι ό ο ς stack pointer, program counter, registers, scheduling policies ύ ο ο α ό ού α ή σ α α έ α σή α α (pending / blocked signals) ο έ α ι ι ά ια threads http://www.javamex.com/tutorials/threads/how_threads_work. shtml 11
Π ο ή α α Vs. ι ασί ς ι ό ος χ ό ος ιο ίας / α ισ ού / α α ής α ύ ά ω Ί ια ή /state. ι ό ο όσ ος ι οι ω ίας α ύ threads ο ύ ύ ο α οι ά ο αι ή σχ ό α ά α. 1 ι ρ. - 1 ή α Ν ι ρ. - 1 ή α 1 ι ρ. - Ν ή ατα Ν ι ρ. - Ν ή ατα http://www.cs.cf.ac.uk/dave/c/node29.html 12
ό ος η ιο ίας Platform fork() pthread_create() real user sys real user sys Intel 2.6 GHz Xeon E5-267 (16 cores/node) 8.1 0.1 2.9 0.9 0.2 0.3 Intel 2.8 GHz Xeon 5660 (12 cores/node) 4.4 0.4 4.3 0.7 0.2 0.5 AMD 2.3 GHz Opteron (16 cores/node) 12.5 1.0 12.5 1.2 0.2 1.3 AMD 2.4 GHz Opteron (8 cores/node) 17.6 2.2 15.7 1.4 0.3 1.3 IBM 4.0 GHz POWER6 (8 cpus/node) 9.5 0.6 8.8 1.6 0.1 0.4 IBM 1.9 GHz p5-575 (8 cpus/node) 64.2 30.7 27.6 1.7 0.6 1.1 IBM 1.5 GHz POWER4 (8 cpus/node) 104.5 48.6 47.2 2.1 1.0 1.5 INTEL 2.4 GHz Xeon (2 cpus/node) 54.9 1.5 20.8 1.6 0.7 0.9 INTEL 1.4 GHz Itanium2 (4 cpus/node) 54.5 1.1 22.2 2.0 1.2 0.6 https://computing.llnl.gov/tutorials/pthreads/ https://computing.llnl.gov/tutorials/pthreads/fork_vs_thread.txt 13
ό ος: real, user, sys Real: α α ι ός χ ό ος σύ φω α ο όι οίχο χ ό ος α ό ί σ ως έ ος ς ήσ ς. ι α βά ι ό ο ο χ ό ο ο έ ασ, αθώς αι ο χ ό ο ο χ σι ο οιήθ α ό ά ς ι ασί ς αι ι ασία ή α ο ισ έ ια α ά ι α, ό α ι έ ι α ιώσ ι / User: χ ό ος ο α α ά αι σ ί ο χ ήσ όχι έσα σ ο ή α ός ς ι ασίας. ι α βά ι ό ο ο α α ι ό χ ό ο ς ια έ σ ς ι ασίας. Οι ά ς ι ασί ς αι ο χ ό ος ο ι ασία ί αι ο ισ έ ι α βά ο αι. Sys: χ ό ος ο α α ά αι σ ί ο ή α ός ς ι ασίας. ι α βά ι ο χ ό ο έ σ ς ς ο α α ά αι σ ήσ ις σ σ ή α ος έσα σ ο ή α, α ά όχι ο χ ό ο ο α α ά αι σ βιβ ιοθή ς σ ο ί ο ο χ ήσ. Ό ως ο 'user', ι α βά ι ό ο χ ό ο ια ι ασία. 14
ί α η ά User-Level Threads -- Thread Libraries Ο ή ας ο ω ί ι ύ ο ο thread switching ός kernel Application specific scheduling. έχ ι σ άθ ο ά ι ό ο ι ασία ά α ό α α ή α α ια ά οιο system calls ά οι α α χ ίο Ο ή ας α αθέ ι ια ι ασία σ άθ ασ ή αι όχι έ α ή α α ά ασ ή. Kernel-level Threads -- System Calls Ό ιαχ ί ισ ήσ ις ο ή α. Ο ή ας χ ο ο/ ί ι α όχ ο έ σ ο α ώ ά ω ς ί ιας ι ασίας σ ο α ούς ασ ές ο ά ι ό ο έ α thread Οι ήσ ις ο ή α ι ά ί αι multithreaded ήσ ις ος ο ή α ί αι α ές.. 15
ύ ο η οι ά ο αι ό ο ς α ι ής ι ασίας. ά ο α ά α ή α α, χ α α ή ι ής αβ ής ύο ί ς C pointers) ί ια ι ή ίχ ο σ ί ια ιοχή ή ς. Α ά ια σ χ ο ισ ό, α οιβαίο α ο ισ ό αι α ο ι ή έ σ ά ω σ ο ς ό ο ς explicit synchronization) ά α ό ο ο α α ισ ή. Α ά οή έ σ ς independent flow of control). ά χο όσο ά χ ι α ι ή ι ασία / «θαί ο» ό α θά ι α ι ή ι ασία ο ς. ί αι αφ ιά lightweight ) σ σχέσ ις ι ασί ς. 16
Π ο ή α α Η σωσ ή ο οί σ ο α ι ώ ο α ά ω σ σ ασ ό φα ο ή ο ς σ α α ά α οβ ή α α α ο σιά ι α ής ι ά ο ή α α: ιώ ι α α ό ισ ω φα ο ώ ιώ ι α ιο οί σ ω ο ύ ω σ σ ά ω ιώ ι ο ή ο ώ ι α Α αι ί/ σ ύ ι ι ό ο ς ο ο ισ ι ούς ό ο ς 17
ή α α POSIX άθη α: ι ο ι ά σ ή α α, ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής
α η ο ί ς Pthreads API ιαχ ί ισ : create, join, set/query attributes (joinable, scheduling).. Mutexes: mutex -> utual e lusio ια σ χ ο ισ ό Creating, destroying, locking and unlocking mutexes χ ήσ ω mutex attribute functions ο α ά ο α α ίσ οιχα thread attributes. Condition variables: create, destroy, wait and signal.. ια ι οι ω ία α ύ ά ω ο οι ά ο αι ο/α ί ιο/α mutexes. Ο ο α α ισ ής ο ί ι ις σ θή ς conditions). Synchronization: ο ί ς ια read/write locks 19
Pthreads API Routine Prefix pthread_ pthread_attr_ pthread_mutex_ pthread_mutexattr_ pthread_cond_ pthread_condattr_ pthread_key_ pthread_rwlock_ Functional Group Threads & miscellaneous subroutines Thread attributes objects Mutexes Mutex attributes objects Condition variables Condition attributes objects Thread-specific data keys Read/write locks pthread_barrier_ Synchronization barriers 20
η ιο ία / α ισ ός ή α ος pthread_create args thread: ο α ι ό α α ω ισ ι ό ια ο έο ή α attr: α ι ί ο thread_attr_t ή ΠUΚΚ ια ις default ι ές start_routine: C ο ί α ο θα έσ ι ο έο ή α arg: α ά ος ο θα άσ σ start_routine ήσ ς pthread_exit α α ι ά: α ί ι α ο ι ά ο ί α start_routine α ί ι ο βασι ό ή α, α ή, φ ά ι σ ο έ ος ς main() ήσ ς pthread_cancel α ό ά ο ή α σ ισ ά αι ια οές ή ς ήσ ς exec() ή exit() ια α ισ ό ό ς ς ι ασίας 21
Attributes ο ή α ος α ά ιο ία ο ή α ος ί αι α ό α α ο ισ ού ι ιό ς οι ο οί ς αθο ί ο όσο α άσ ασ όσο αι ι ο ία ο ή α ος. Scheduling inheritance, sched policy, sched parameters, sched contention scope Stack size, Stack address Ο ισ ός ι ιό ας: pthread_attr_i it α ά σ ι ιό ας: pthread_attr_destro 22
Πα α ί α α άθη α: ι ο ι ά σ ή α α, ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής
Α ό α ά ι α 1. #include <pthread.h> 2. #include <stdio.h> 3. #define NUM_THREADS 5 Η ο ί α ας ο θα σ ί 1. void *PrintHello(void *threadid) { 2. long tid = (long)threadid; 3. printf("hello from thread #%ld!\n", tid); 4. pthread_exit(null); 5. } α ά οι 1. int main (int argc, char *argv[]) { 2. pthread_t threads[num_threads]; ήή π ακας από ατα 3. int rc; long t; 4. for(t=0; t < NUM_THREADS; t++){ 5. printf("in main: creating thread %ld\n", t); 6. rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 7. if (rc){ 8. printf("error code from pthread_create() is %d\n", rc); 9. exit(-1); } 1. } 2. pthread_exit(null); ήή ΠΑΝΤΑ!!! 3. } α α ήσιο ώ: https://computing.llnl.gov/tutorials/pthreads/samples/hello.c 24
Ά α α α ί α α ισσό α α α ί α α: https://computing.llnl.gov/tutorials/pthreads/samples/hello_arg1.c https://computing.llnl.gov/tutorials/pthreads/samples/hello_arg2.c https://computing.llnl.gov/tutorials/pthreads/samples/hello_arg3.c Πα ά ι α ήση struct 25
Eισα ή σ ο σ ο ισ ό άθη α: ι ο ι ά σ ή α α, ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής
Α ό όβ η α α οιβαίο α ο ισ ού Έσ ω ύο ή α α Α αι αι αβ ή i α ούσα ι ή i:=5 ο Α ί: i ++; ο ί: -- i; οιο ί αι ο σωσ ό α ο έ σ α ά έ σ ω ο ώ ; i = 6, i = 5 i = 4, i = 5 i = 6, i = 4 i = 4, i = 6 27
Π όβ η α α α ού / α α α ή Έ α ισσό α ή α α α ά ο ο έ α αι α ο οθ ού σ έ α α ι ή (buffer) Έ α ισσό α ή α α αφαι ού αι α α α ώ ο α α αχθέ α ο έ α α ό ο α ι ή Α α ο ύ αι α όχ ο όσβασ σ ο α ι ή. Έ α ή α ό ο οσθέ ι ή αφαι ί. α α α ές α ά αύ ο σα σ ο ία: 1 α α ω ός 1 α α α ω ής α α ω οί 1 α α α ω ής α α ω οί K α α α ω ές 28
α ι ής α ί ο έθο ς Producer: 1. while (true) { 2. b [in] = v; 3. in++; 4. } Π όβ η α 1: η α ισ ι ό Οι α ι ές ο ί α ί αι α ί ο έθο ς. Consumer: 1. while (true) { 2. while (in <= out) /* do nothing */; 3. w = b [out]; 4. out++; 5. } Π όβ η α : pin lock : σ χ ο ισ ός χω ίς condition variables Σ α α ά ι χ ό ο α ό η CPU σ α while όσο η ι ασία έχ ι σ η α οχή ης η CPU 29
ύση : ι ός α ι ής Producer: 1. while (true) { 2. /*produce item v */ while ((in + 1) % n == out); 3. b [in] = v; 4. in = (in + 1) % n; 5. } Consumer: 1. while (true) { 2. while (in == out); 3. w = b [out]; 4. out = (out + 1) % n; 5. } ο pin lock ό ς α α έ ι.. 30
Producer: 1.while (true) { 2. pthread_mutex_lock (&M); 3. while ((in + 1) % n == out) pthread_cond_wait(&out_cv, &M); 4. b [in] = v; Condition Variable 1 5. in = (in + 1) % n; 6. pthread_cond_signal (&In_CV); 7. pthread_mutex_unlock (&M); 8.} ο ισ ός condition variables Mutex Consumer: 1. while (true) { 2. pthread_mutex_lock (&M); 3. while (in == out) pthread_cond_wait (&In_CV,&M); 4. w = b [out]; 5. out = (out + 1) % n; 6. pthread_mutex_unlock(&m); 7. pthread_cond_signal (&Out_CV); 8. } Condition Variable 2 31
Βιβ ιο αφία άθη α: ι ο ι ά σ ή α α, ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής
Online Βιβ ιο αφία αι α αφο ές 1. http://www.cs.cf.ac.uk/dave/c/node29.html 2. https://computing.llnl.gov/tutorials/pthreads/ 3. https://computing.llnl.gov/tutorials/pthreads/man/sch ed_setscheduler.txt 4. http://www.javamex.com/tutorials/threads/how_threa ds_work.shtml 5. http://en.wikipedia.org/wiki/posix_threads 6. standards.ieee.org/findstds/standard/1003.1-2008.html 7. www.opengroup.org/austin/papers/posix_faq.html 8. www.unix.org/version3/ieee_std.html 33
έ ος ο ισ η ια ής ό η ας # 3 άθη α: ι ο ι ά σ ή α α, ο ισ η ια ή ό η α # 3 : ισα ω ή σ α ή α α POSIX Threads ( έ ος 1 ο ) ή α: οφο ι ής