Documente Academic
Documente Profesional
Documente Cultură
Sisteme Operare
Sisteme Operare
8
Fire de execuie
4 aprilie 2011 - 10 aprilie 2011
04.04.2011 - 10.04.2011
Suport curs 8
OSC
o o
Capitolul 4 Threads Capitolul 2 Processes and Threads Seciunea 2.2 Threads Capitolul 12 POSIX Threads
04.04.2011 - 10.04.2011
Cuprins
De ce fire de execuie? Modele de fire de execuie POSIX Threads Thread-uri n Windows Mecanisme de sincronizare Probleme de sincronizare
04.04.2011 - 10.04.2011
Fire de execuie
Thread-uri O secven de control n cadrul unui proces LWP lightweight processes Un proces are unul sau mai multe thread-uri Partajeaz resursele procesului SO multithreaded
o
04.04.2011 - 10.04.2011
SO folosete thread-uri pentru a grupa informaii necesare execuiei unui flux de instruciuni
o
04.04.2011 - 10.04.2011
04.04.2011 - 10.04.2011
De ce thread-uri?
Timp de creare mai mic Schimbri de context rapide ntre thread-uri [1] Uor de partajat informaii ntre thread-uri
o o
ntre procese este mai dificil (se poate cu memorie partajat) mix ntre operaii de intrare/ieire i operaii de calcul
04.04.2011 - 10.04.2011
De ce thread-uri? (2)
04.04.2011 - 10.04.2011
De ce nu thread-uri?
Daca moare un thread, moare tot procesul Partajarea datelor nu exist protecie
o o o
un thread poate suprascrie datele altui thread TLS (Thread Local Storage)/TSD (Thread Specific Data)
Concuren exagerat
prea multe thread-uri degradeaz performana sistemului: overhead context switching o implementri event-based, async I/O - alternativ
Probleme de concuren
o
04.04.2011 - 10.04.2011
mai uor de urmrit mai uor de neles ncapsularea unui flux de execuie secvenial
04.04.2011 - 10.04.2011
Nu exist noiunea de concuren Este nevoie de main de stri pentru modelul asincron Programul principal (main loop) este notificat de apariia unui eveniment (ex. select) Concurena thread-urilor poate cauza probleme Lucrul cu thread-uri nu este scalabil la numrul de thread-uri [2] Thread-urile pot fi utilizate pe sisteme multiprocesor/multicore (true concurency) [3]
Avantaje/dezavantaje
o o o
04.04.2011 - 10.04.2011
04.04.2011 - 10.04.2011
04.04.2011 - 10.04.2011
dispatcher
while (1) { get_next_request(&buf); handoff_work(&buf); }
worker
while (1) { wait_for_work(&buf); look_for_page_in_cache(&buf, &page); if (page_not_in_cache(&page)) read_page_from_disk(&buf,&page); return_page(&page); }
04.04.2011 - 10.04.2011
Da (per proces)
o o o o o o o o o
variabilele globale (.data, .bss) [4] fiierele deschise spaiul de adres masca de semnale registrele stiva program counter/Instruction pointer stare TLS (Thread Local Storage)
Nu (per thread)
04.04.2011 - 10.04.2011
n biblioteci
o o
04.04.2011 - 10.04.2011
User-level threads
Bibliotec dedicat
o o o
o o
04.04.2011 - 10.04.2011
04.04.2011 - 10.04.2011
Uor de integrat n SO
o o o
nu sunt necesare modificri pot oferi suport multithreaded pe un SO fr suport multithreaded nu se execut apeluri de sistem n nucleu
04.04.2011 - 10.04.2011
Planificare cooperativ
o o
nu exist ntreruperi de ceas precise [5] mecanismele existente pot fi folosite i de thread-uri (nu doar de bibliotec) oricum este nevoie de un trap n kernel
04.04.2011 - 10.04.2011
Kernel-level threads
Suport n kernel
o o
Avantaje
o o o
fr probleme cu apeluri blocante fr probleme cu page fault-uri pot fi planificate pe sisteme multiprocesor
04.04.2011 - 10.04.2011
04.04.2011 - 10.04.2011
Abordare hibrid
04.04.2011 - 10.04.2011
Operaii cu thread-uri
04.04.2011 - 10.04.2011
POSIX threads
Standard POSIX (IEEE 1003.1c) API pentru crearea i sincronizarea thread-urilor API-ul specific doar comportamentul
o
Sisteme UNIX Inclus header-ul: #include <pthread.h> Legarea bibliotecii: -lpthread man 7 pthreads
04.04.2011 - 10.04.2011
Creare
pthread_t tid; pthread_create(&tid, NULL, thread_fun, (void *) arg);
pthread_exit(void *ret); pthread_join(pthread_t tid, void **ret); pthread_cancel(pthread_t tid); apt-get install manpages-posix manpages-posix-dev
o
04.04.2011 - 10.04.2011
Thread-uri n Linux
Firele de execuie sunt implementate n kernel Nu se face distincia ntre thread-uri i procese Procesele i thread-urile sunt abstractizate n task-uri
o
Diferena dintre thread-uri i procese este partajarea anumitor resurse (spaiu de adres, fiiere)
04.04.2011 - 10.04.2011
Specific Linux Folosit de fork() i de NPTL pentru crearea proceselor i a firelor de execuie Diferite flag-uri specific ce resurse sunt partajate
o o o
man 2 clone
04.04.2011 - 10.04.2011
NPTL
New POSIX Thread Library Implementarea curent din glibc/Linux Necesit kernel 2.6 (futex-uri) Implementare 1:1 (kernel-level threads) Folosete clone Thread-urile sunt grupate n acelai grup de thread-uri (thread group)
o
04.04.2011 - 10.04.2011
Thread-uri n Windows
Model hibrid
04.04.2011 - 10.04.2011
04.04.2011 - 10.04.2011
Reentran
Apel reentrant
o o o o o
un apel n execuie al unei instane nu afecteaz un apel simultan nu lucreaz cu variabile globale/statice nu apeleaz funcii non-reentrante nu se refer doar la thread-uri: semnale, ntreruperi se folosesc doar stiva i argumentele transmise funciei
04.04.2011 - 10.04.2011
Thread-safety
Funcii/apeluri thread-safe Operaii sigure n context multithreaded Pot fi apelate simultan de mai multe thread-uri Conteaz implementarea Implementare
o o o o
04.04.2011 - 10.04.2011
Mecanisme de sincronizare
Sincronizare/coordonare (notificare/ateptare)
04.04.2011 - 10.04.2011
Mutex/Critical Section
Win32 API
04.04.2011 - 10.04.2011
Semafoare
04.04.2011 - 10.04.2011
Variabile condiie/evenimente
04.04.2011 - 10.04.2011
Monitoare
Datele pot fi accesate doar prin intermediul procedurilor monitorului Procesele trec din starea READY n BLOCKED (i invers)
o
04.04.2011 - 10.04.2011
Monitoare (2)
04.04.2011 - 10.04.2011
Operaii pe monitor
Intrarea n monitor: m.entry(); Ieirea din monitor: m.leave(); Semnalarea unei condiii: m.signal(cond); Ateptarea unui condiii: m.wait(cond); Cozi de ateptare n monitor
o o
04.04.2011 - 10.04.2011
Funcionare monitor
n cazul mai multor apeluri de proceduri ntr-un monitor, un singur thread ruleaz
o
Cnd se termin de rulat procedura se spune c thread-ul a cedat monitorul Un apel wait
o o o
thread-ul curent se blocheaz este dispus n coada de ateptare specific cedeaz monitorul
Politici de planificare
o o
04.04.2011 - 10.04.2011
H2O problem Thread-urile reprezint atomi de hidrogen sau oxigen O molecul de ap se formeaz din doi atomi de hidrogen i unul de oxigen Dac exist doi atomi de hidrogen, vor trebui s atepte un atom de oxigen Dac exist un atom de oxigen, va trebui s atepte doi atomi de hidrogen
04.04.2011 - 10.04.2011
Semaphore hsem; Semaphore osem; Mutex mutex; void hydro_fun(void) { up(hsem); down(osem); bond(); }
04.04.2011 - 10.04.2011
Monitor m; Cond m.oxy_cond; Cond m.hydro_cond; void oxy_fun(void) { m.enter(); o_count++; if (hcount >= 2) { m.hydro_cond.signal(); m.hydro_cond.signal(); h_count -= 2; } else m.oxy_cond.wait(); m.leave(); bond(); }
void hydro_fun(void) { m.enter(); h_count++; if (h_count == 2 && o_count >= 1) { m.hydro_cond.signal(); h_count -= 2; m.o_cond.signal(); o_count--; } else m.hydro_cond.wait(); m.leave(); bond(); }
04.04.2011 - 10.04.2011
Cuvinte cheie
thread multithreading Thread Local Storage thread-based event-based user-level threads kernel-level threads POSIX Threads apelul clone
NPTL fibre reentran thread-safe mutex semafor monitor variabil condiie event
04.04.2011 - 10.04.2011
Exerciiu 1
Indicai dou zone de memorie (nu registre) care nu sunt partajate ntre thread-urile aceluiai proces. Cte cozi de ateptare exist n cadrul unui monitor? Cte threaduri pot atepta la fiecare coad la un moment dat?
04.04.2011 - 10.04.2011
Exerciiu 2
Fie un sistem cu 4 procesoare i o aplicaie cu 4 fire de execuie ce folosete un sistem de thread-uri implementat n userspace. Presupunnd c nu mai exist alte procese/fire de execuie n sistem, i c fiecare thread ruleaz timp de 10ms, apoi ateapt 10ms la IO, i ruleaz apoi nc 10ms, determinai timpul minim de execuie a aplicaiei.
04.04.2011 - 10.04.2011
Exerciiu 3
char *ctime(const time_t *timep); char *strdup(const char *s); char *strchr(const char *s, int c); void *memcpy(void *dest, const void *src, size_t n);
04.04.2011 - 10.04.2011
ntrebri
04.04.2011 - 10.04.2011