Sistemas Operacionais I Aula Prática 2 - Tarefas Objetivo • Descrever o que são tarefas e como são criadas nos programas. Material de Apoio • • • • Para aula 1 baixe o material disponível em http://siep.ifpe.edu.br/anderson/arquivos/so_aula2_pratica.zip Acesse a máquina de trabalho pelo putty com o IP 192.168.7.229. Utilize a senha que foi passada durante as aulas. É indispensável o entendimento do SO Linux. Caso precise de ajuda acesse o site http://siep.cefetpe.br/anderson/arquivos/linux.zip e busque informações de utilização. Atenção! Todos os exercícios marcados com vermelho são opcionais e se algum aluno fizer ganhará um diferencial na nota. Caso nenhum aluno faça a questão, a nota geral será descontada, valendo 80%. Não sendo possível obter a nota máxima. Introdução 1. Criação de tarefas a) Copie o arquivo so_aula2_pratica.zip para a sua área de trabalho e descompacte o seu conteúdo: unzip so_aula2_pratica.zip b) Estude, compile e execute a aplicação. Observando o esquema de criação de threads das tarefas c) Porque é indeterminado o conteúdo da variável global Value? d) Monte um experimento que prove a afirmação do quesito “c”. (sugestão: utilize a chamada de sistema sleep). 2. É possível implementar o conceito de pseudoparalelismo sem recorrer ao núcleo do sistema operacional? Justifique. 3. Considere o código descrito em fork1.c. Qual a saída deste programa? Justifique. 4. Para cada uma das seguintes afirmações, indique se esta pode ou não ser um motivo válido para a utilização de múltiplas threads reais em um programa, e explique por quê. a) Melhorar o desempenho de uma aplicação em um multiprocessador. b) Ter múltiplos fluxos de execução com espaços de endereçamento separados no mesmo programa. c) Poder sobrepor a execução de instruções de E/S com a utilização da CPU por outras partes do mesmo programa. d) Executar dois programas diferentes (correspondentes a diferentes arquivos executáveis) em paralelo. 5. Considere o seguinte trecho de código descrito no padrão POSIX 1 int a; 2 fn() { 3 a++; 4 printf("X %d\n", a); 5 exit(0); 6 } 7 main() { 8 int val; 9 a = 0; 10 printf("Y %d\n", a); 11 if (fork()==0) 12 fn(); 13 wait(&val); 14 printf("Z %d\n", a); 15 } a) Qual a saída desse programa? Se houver mais do que uma possibilidade, indique todas as possíveis saídas. b) Escreva um novo programa que seja equivalente (no sentido de executar a mesma sequencia de código, apesar de não ter necessariamente a mesma saída), exceto no seguinte aspecto: na linha 12 deve ser lançada uma nova thread em vez de um novo processo. Tenha o cuidado de atualizar as funções restantes do sistema operacional que são invocadas conforme este código. c) Qual a saída do novo programa? Justifique a resposta. d) Ordene em termos da velocidade de execução, da mais lenta para a mais rápida, as seguintes possibilidades para a execução deste programa: i) Usando threds reais ii) Usando pseudothreads iii) Usando processos e) Para questão anterior explique a razão principal para o desempenho relativo entre as threads reais e as pseudothreads. Exercício opcional Repita a questão do item “b”, mas utilizando threads Windows. Compare as primitivas para a criação de um processo no Linux e no Windows, indicando as vantagens de cada uma em relação à outra.