Resumen T2 Threads (2015)

Resumen Español
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ciencias y Tecnologías de Telecomunicación - 2º curso
Asignatura AST
Año del apunte 2015
Páginas 5
Fecha de subida 23/02/2015
Descargas 61
Subido por

Vista previa del texto

Carlos Angulo AST T2 Threads Hi ha dues possibles implementacions per fer Threads 1 Heretant de Thread 2 Implementant Runnable Clase MyThread Clase MyRunnable Execució Execució Resumen AST 1 Carlos Angulo AST T2 Threads Programa Seqüència d’activitats per dur a terme per part d’un processador • Procés: Execució del programa per part d’un processador • Recurs (compartit) : Dispositiu físic o lògic que necessiten els processos per dur a terme la seva activitat.
Pot ser una variable compartida que es modificarà per més d’un Thread.
Execució en exclusió mútua Quan un recurs és accedit per més d’un procés (recurs compartit) s’anomena ZONA CRÍTICA ZC • Si un procés esta executant la/una zona crítica cap altre pot executar-la /accedir-hi Estructura General d’un procés accedint a ZC Thread T[i] { //1≤i ≤n While(true){ Zona no Critica L’Access al recurs compartit (que estarà dins la ZC) és durant un temps finit Requeriments Protocol d’entrada a ZC Zona Critica Protocol de sortida de ZC Zona no Critica 1) Si un Thread està a ZC cap altre Thread pot ser-hi 2) Si 2 o més Threads volen entrar a ZC un i només un ho aconseguirà 3) Si un Thread està fora de ZC no pot evitar que altres Threads hi entrin 4) No es pot endarrerir de manera indefinida l’entrada d’un Thread a ZC (consumeix recursos) } } NO fer mai això a l’examen Solucions al problema d’exclusió mútua • Primera solució boolean ocupat; ocupat = false; ocupat és el recurs compartit Thread(){ While(true){ While(ocupat==true){} ocupat=true; Bucle d’espera activa Busy waiting Thread(){ While(true){ While(ocupat==true){} ocupat=true; ZC ZC Ocupat=false } Ocupat=false } } } ] ] Si tots dos intenten accedir-hi alhora els dos veuran ocupat==false i entraran en un buble Resumen AST 2 Carlos Angulo AST • Segona solució Recursos compartits: boolean dinstT1,dinsT2; dinsT1=false; dinsT2=false; un Thread pot modificar la seva variable però només pot consultar la de l’altre Thread Thread(){ While(true){ dinsT1=true; While(dinsT2==true){} Thread(){ While(true){ dinsT2=true; While(dinsT1==true){} ZC ZC dinsT1=false; } dinsT2=false; } } } ] ] Es pot donar el cas que tots dos canviïn T1 i T2 a false al mateix temps i després no puguis accedir a ZC, es poden quedar en un bucle on ningú hi entra ( enclavament , deadlock, linelock) • Algorisme de Peterson (Tie-break) boolean dinstT1,dinsT2; int ultim;// ultim Thread que ha volgut entrar a ZC dinsT1=false; dinsT2=false; ThreadA(){ While(true){ dinsT1=true; ultim=1; While(dinsT2==false||ultim=2){} ThreadB(){ While(true){ dinsT2=true; Ultim=2; While(dinsT1==false||ultim=1){} ZC ZC dinsT1=false; } dinsT2=false; } } ] } ] Clase Mutex Podemos crear una clase que gestione el acceso (entrada y salida) a la zona critica ThreadA(){ Mutex mu; While(true){ mu.entrarZC(); ZC mu.sortirZC(); } } ] Resumen AST 2 Carlos Angulo AST • Cas de n Threads. Algorisme de Lampart (Backery)- PANADERIA • • • boolean dinstT1,dinsT2; int ultim;// ultim Thread que ha volgut entrar a ZC dinsT1=false; dinsT2=false; Client entra i agafa numero més gran que els que hi ha Tots els clients s’esperen a que arribi el seu numero El client amb el numero més petit és el que és servit primer int[] torn= new int[n] //Torn[i] = el numero de torn del Thread i Thread[i] // 1≤i ≤n While(true){ torn[i]=max(torn())+1 } De manera atòmic (es fa de cop sense que es faci res alhora) int[] torn= new int[n] //Torn[i] = el numero de torn del Thread[i] Thread[i] // 1≤i ≤n While(true){ torn[i]=max(torn())+1 } Thread{i}(){ //1≤i ≤n while(true){ De manera atòmica torn[i]=max(torn[1..n])+1; for(j=1..n tal que j!=i){ while(torn[j]==0||torn[j]>torn[i]){} En relació amb torn[i] ell ja pasa davant ZC torn[i]=0; } ] N=2 Thread1(){ while(true){ Thread2(){ while(true){ //torn[1]=max(torn[1..n])+1; torn[1]=torn[2]+1 While(torn[2]≠0&&torn[1]>torn[2]){} torn[2]=torn[1]+1; While(torn[1]≠0&&torn[2]≥torn[1]){} ZC ZC torn[2]=0; torn[1]=0; ] ] Si tots dos tenen el mateix torn no entraria en cap dels dos Resumen AST 2 Carlos Angulo AST Solución de hardware al problema de exclusión mutua En maquinas multiprocesadores existe una instrucción que: 1. Lee una variable boolean y guarda su valor inicial 2. Cambia el valor de la variable al contrario del inicial a) Lo pone a true si al principio era false b) Lo pone a false si al principio era true 3. Devuelve su valor inicial De manera atómica b=false; b=true; TS(b) //devuelve false //pero ahora b=true TS(b) //devuelve true //pero ahora b=false TestAndSet TS Clases y métodos ya implementado en la API de java: • public class AtomicBoolean • public final boolean getAndSet(boolean newValue) Creamos una clase que gestione el acceso (entrada y salida) a la zona critica mediante un AtomicBoolean Clase Mutex con AtomicBoolean ThreadA(){ Mutex mu; While(true){ mu.entrarZC(); ZC mu.sortirZC(); } } ] • • Si bloquejat = true ,no puede acceder a ZC, devuelve true y se queda en el while Si bloquejat= false, lo pone a true, devuelve false y sale del while y nadie más puede acceder a ZC Resumen AST 2 ...