Sunteți pe pagina 1din 49

Cursul 8

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

MOS Beginning Linux Programming


o

Windows System Programming


o o

Capitolul 7 Threads and Scheduling Capitolul 8 Thread Synchronization

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

suport rularea mai multor thread-uri n cadrul aceluiai proces

04.04.2011 - 10.04.2011

Thread-uri vs. procese

Instane de execuie SO folosete procesele pentru a grupa resurse


o

proces abstractizarea execuiei, resurselor, spaiului de adres

SO folosete thread-uri pentru a grupa informaii necesare execuiei unui flux de instruciuni
o

thread abstractizeaz execuia (resursele sunt deinute de proces)

04.04.2011 - 10.04.2011

Procese singlethread si multithread

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

Utile chiar si pe uniprocesor Planificare pe sisteme multiprocesor/multicore

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

condiii de curs / deadlock-uri

04.04.2011 - 10.04.2011

Fire de execuie ca model

Model de execuie secvenial Fiecare thread execut secvenial un set de instruciuni


o o o

mai uor de urmrit mai uor de neles ncapsularea unui flux de execuie secvenial

Sistemele complexe pot fi privite ca o compunere de fire de execuie

04.04.2011 - 10.04.2011

Thread-based vs. event-based

Event-based / async I/O


o o o

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

Editor de texte multithreaded

04.04.2011 - 10.04.2011

Server web multithreaded

04.04.2011 - 10.04.2011

Server web multithreaded (2)

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

Ce (nu) partajeaz thread-urile?

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

Implementarea firelor de execuie

n biblioteci
o o

user-level threads kernel-level threads

n kernel Implementare hibrid

04.04.2011 - 10.04.2011

User-level threads

Bibliotec dedicat
o o o
o o

creare terminare planificare


nucleul nu vede thread-urile PC, registre, stiv, stare

Singura entitate planificabil de SO este procesul

Biblioteca menine o tabel cu firele de execuie ale procesului


Model many-to-one

04.04.2011 - 10.04.2011

User level threads (2)

04.04.2011 - 10.04.2011

Avantaje user threads

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

Schimbare de context rapid Aplicaiile pot implementa planificatoare n funcie de necesiti

04.04.2011 - 10.04.2011

Dezavantaje user threads

Un apel de sistem blocante blocheaz ntreg procesul


modificare SO modificare bibliotec pentru a verifica dac un apel este sau nu blocant o rmn probleme la page fault-uri
o o

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

Aplicaiile care folosesc des apeluri de sistem


o

04.04.2011 - 10.04.2011

Kernel-level threads

Suport n kernel
o o

creare, terminare, planificare entiti planificabile

Model unu la unu (1:1) Dezavantaje


o

creare i schimbare de context mai lent

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

Kernel-level threads (2)

04.04.2011 - 10.04.2011

Abordare hibrid

04.04.2011 - 10.04.2011

Operaii cu thread-uri

Creare ncheierea execuiei Terminare (cancellation) Ateptare (join) Planificare Sincronizare

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

implementarea se realizeaz n bibliotec

Sisteme UNIX Inclus header-ul: #include <pthread.h> Legarea bibliotecii: -lpthread man 7 pthreads

04.04.2011 - 10.04.2011

Operaii POSIX threads

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

man -S 3posix pthread_create

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

Fiecare thread/proces este descris de structura struct task_struct

Diferena dintre thread-uri i procese este partajarea anumitor resurse (spaiu de adres, fiiere)

04.04.2011 - 10.04.2011

Apelul de sistem clone

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

CLONE_NEWNS CLONE_FS, CLONE_VM, CLONE_FILES CLONE_SIGHAND, CLONE_THREAD

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

getpid(2) ntoarce tgid (thread group id) http://people.redhat.com/drepper/nptl-design.pdf

04.04.2011 - 10.04.2011

Thread-uri n Windows

Model hibrid

Firele de execuie implementate n user-mode sunt denumite fibre


o o

planificare cooperativ blocarea unei fibre blocheaz firul de execuie

Firele de execuie implementate n kernel

04.04.2011 - 10.04.2011

Operaii cu thread-uri n Windows

HANDLE CreateThread(...) ExitThread WaitForSingleObject/MultipleObjects GetExitCodeThread TerminateThread TlsAlloc TlsGetValue/TlsSetValue

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

Conteaz interfaa oferit de funcie

Anumite apeluri de bibliotec au versiuni reentrante (gethostbyname_r)


o

pentru activare, n POSIX threads se definete macroul _REENTRANT

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

reentran excludere mutual TLS operaii atomice [6]

04.04.2011 - 10.04.2011

Mecanisme de sincronizare

Apeluri reentrante Acces exclusiv (concuren)


o o o o o o

seciuni critice mutex-uri variabile condiie evenimente semafoare monitoare

Sincronizare/coordonare (notificare/ateptare)

04.04.2011 - 10.04.2011

Mutex/Critical Section

Acces exclusiv POSIX threads: pthread_mutex_...


o o o o o o o o

init/destroy lock/unlock/trylock Create/OpenMutex Close Handle ReleaseMutex WaitForSingleObject Initialize/DeleteCriticalSection Enter/TryEnter/LeaveCriticalSection

Win32 API

04.04.2011 - 10.04.2011

Semafoare

sem_t sem; sem_init sem_destroy sem_wait sem_trywait sem_post

HANDLE hSem; CreateSemaphore CloseHandle WaitForSingleObject ReleaseSemaphore

04.04.2011 - 10.04.2011

Variabile condiie/evenimente

pthread_cond_t cond pthread_cond_init pthread_cond_destroy pthread_cond_signal pthread_cond_broadcast pthread_cond_wait

HANDLE event CreateEvent OpenEvent SetEvent ResetEvent PulseEvent WaitForSingleObject

04.04.2011 - 10.04.2011

Monitoare

Hoare (1974), Brinch Hansen (1975) O colecie de proceduri i structuri de date


o

un singur proces/thread poate rula la un moment dat

Datele pot fi accesate doar prin intermediul procedurilor monitorului Procesele trec din starea READY n BLOCKED (i invers)
o

proceduri de forma signal/wait

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

cozi pentru ateptare pentru fiecare condiie coad de intrare n semafor

04.04.2011 - 10.04.2011

Funcionare monitor

n cazul mai multor apeluri de proceduri ntr-un monitor, un singur thread ruleaz
o

thread-ul deine monitorul

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

signal and wait signal and continue

04.04.2011 - 10.04.2011

Problema formrii apei

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

Problema formrii apei - semafoare

Semaphore hsem; Semaphore osem; Mutex mutex; void hydro_fun(void) { up(hsem); down(osem); bond(); }

void oxy_fun(void) { down(mutex); down(hsem); down(hsem); up(osem); up(osem); up(mutex); bond(); }

04.04.2011 - 10.04.2011

Problema formrii apei - monitoare

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

Care din urmtoarele funcii este, probabil, reentrant?


o o o o

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

S-ar putea să vă placă și