Você está na página 1de 2

4.1 Exemplo um: Compactador de arquivos usando deflate (zip).

Um algoritmo de compactao que compacta um conjunto de dois ou mais arquivos pode s e beneficiar de mltiplas threads. O algoritmo pode ser implementado de tal forma que mltiplas threads sejam criadas e cada uma compacte um arquivo diferente ao me smo tempo (se houver mais de um ncleo disponvel), para os arquivos resultantes ser em juntados no arquivo zip final. Exemplo dois: Transcodificao de mdia (vdeo ou udio). Um transcodificador de mdia tem como entrada um arquivo de mdia em um determinado formato (ex: avi), e tem como sada o mesmo arquivo em um formato diferente (ex: r mvb). Um programa pode implementar a transcodificao de mdia utilizando mltiplas thre ads, criando vrias threads e atribuindo a cada uma delas uma poro da mdia a ser tran scodificada, juntando no fim o resultado em um nico arquivo. 4.2 Primeira diferena: As threads de usurio so implementadas por bibliotecas da linguag em, de forma que o sistema operacional em si no tem conhecimento da existncia dela s. J as threads do kernel so gerenciadas pelo prprio kernel. Somente as threads de kernel podem tirar proveito de um sistema multiprocessado, contudo as threads de usurio so portveis, porque fazem parte de uma biblioteca que pode ser portada para vrios sistemas. Segunda diferena: Como o kernel desconhece a existncia das threads de usurio, a esc olha de como elas sero escalonadas ser feita pela biblioteca e no pelo kernel. J as threads do kernel sero escalonadas de acordo com as polticas do escalonador do ker nel, no podendo ser alteradas pelo usurio. Threads de usurio podem ter seu comportamento alterado de acordo com a necessidad e do usurio, j que o escalonamento feito pela biblioteca e no pelo kernel. Contudo, como so todas partes de um mesmo processo, se uma thread de usurio travar, o proc esso todo ir travar, o que no aconteceria com threads do kernel, por serem verdade iramente independentes. 4.3 O kernel armazena todo o estado de execuo do processo. Armazena os valores de todo s os registradores em uma estrutura chamada PCB, e restaura os valores dos regis tradores para o processo que passar a ser executado em seguida. 4.4 Ao se criar uma thread, todo recurso no compartilhado precisa ser criado. Uma thr ead, por exemplo, utiliza o mesmo espao de endereamento de memria das outras thread s do processo, de forma que ao ser criada, a thread no aloca uma nova poro da memria principal e no cria um novo espao de endereamento de memria. Uma nova thread precis a de um program Counter separado do processo que a criou, assim como registrador es, estado e pilha de execuo separadas. Se um novo processo fosse criado ao invs de uma nova thread, ele precisaria de um novo espao de endereamento, novas variveis g lobais, lista de arquivos abertos, lista de processos filhos, lista de alarmes, lista de sinais e manipuladores de sinais e informaes sobre contadores. 4.5 Considere que um sistema operacional relaciona threads em nvel de usurio ao kernel usando o modelo muitos-para-muitos e o mapeamento feito por meio de LWPs. Alm do mais, o sistema permite que os desenvolvedores criem threads em tempo real. nec essrio vincular um thread em tempo real a um LWP? Explique. 4.6 Um programa Pthread que realiza a funo de somatrio foi apresentado

na Seo 4.3.1. Reescreva esse programa em Java. |||||||||||||||||||||||||||||||||||||||||||||||||| #include <pthread.h> ; ttinclude <stdio . h> int sum; /* this data is shared by the thread(s) */ void *runner(void *param); /* the thread */ public static void main(String[] args) { pthread_t tid; /* the thread identifier */ pthreadin nxt attr; /* set of thread attributes */ if (args.lenght() != 2) { System.err.println("usage: a.out <integer value>\n); return -1; } int a = Integer.parseint(args[l]); if (a < O) { System.err.println(a + " must be >= O\n"); return -1; } /* get the default attributes */ pthreadi nLinit(&attr); /* create the thread */ pthreadrcreate(&tid,&attr,runner,argv[1]); /* wait for the thread to exit */ pthread_join(tid,NULL); System.out.println("sum = "+sum+"\n"); } /* The thread will begin control in this function */ Void *runner(void *param) { int i, upper = Integer.parseint(param); sum = O; for (i = 1; i <= upper; i++){ sum += i; } pthreadrexit(O); ||||||||||||||||||||||||||||||||||||||||||||||||||